我的函数应该返回指向 std::vector 的指针还是对 std::vector 的引用?

2023-12-20

我有一个std::map<int, std::vector<SomeStruct>>,
并提供如下查询std::vector<SomeStruct> FindData(int key).

为了防止复制整个数据,我将其修改为std::vector<SomeStruct>& FindData(int key).
但具体情况不会有任何数据key,所以有时我没有什么可回报的。
在这种情况下,我声明一个空的文件范围变量std::vector<SomeStruct>并归还它。

但如果我选择指向向量的指针,那就是std::vector<SomeStruct>* FindData(int key)然后我就可以回来了NULL对于不存在的key.

哪一个更好?
我了解到该指针指向std::vector问题中很糟糕(或很奇怪?不确定)(这个指针操作还有其他语法吗? https://stackoverflow.com/questions/15703842/is-there-other-syntax-for-this-pointer-operation/15703927?noredirect=1#comment22312516_15703927)
我个人喜欢参考std::vector太,这样我就可以使用operator[]更容易,但缺点是我必须为其声明一个额外的空变量。

代码示例如下:SomeClass.h

typedef std::vector<SomeStruct> DataVec;
typedef std::map<int, DataVec> DataMap;
DataMap m_DataMap;

Now In SomeClass.cpp:

Case 1:

namespace
{
    DataVec EmptyVector;
}

DataVec& FindDatas(int key)
{
    DataMap::iterator It = m_DataMap.find(key);

    if (It == m_DataMap.end()) return EmptyVec;

    return It->second;
}

Case 2:

DataVec* FindDatas(int key)
{
    DataMap::iterator It = m_DataMap.find(key);

    if (It == m_DataMap.end()) return NULL;

    return &(It->second);
}

参考:
优点:看起来很正常std::vector.
缺点:声明了额外的变量。

指针:
优点:查询函数更短并且不需要其他变量。
缺点:看起来很奇怪(?!),而且你不能使用p[i], 你必须(*p)[i],这很烦人。

哪一个更好?


您还可以将输出的引用作为参数给出,以便您可以添加一些枚举器或布尔结果作为方法输出:

    namespace
    {
        DataVec EmptyVector;
    }

    bool FindDatas(int key, DataVec& output)
    {
        DataMap::iterator It = m_DataMap.find(key);

        if (It == m_DataMap.end()) return false;

        output = It->second;
                    return true;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的函数应该返回指向 std::vector 的指针还是对 std::vector 的引用? 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 关于匿名“自引用”数据结构的建议/讨论

    对任何错误的术语表示歉意 我对计算机科学还很陌生 而且我几乎只知道 Clojure 但我想我会说我非常了解它 所以 我没有对此进行大量研究 但有时我发现在编写 Clojure 代码时它很有用 能够从该数据结构中引用一些 我所在的任何数据结构
  • 如何使用WixToolset v3.11修改json

    我想修改现有 json 文件中的值 当我运行安装程序时 我输入指向我的 API 的服务器名称 输入服务器名称后 我想在应用程序设置中添加该值json file http dotnetbyexample blogspot ro 2010 11
  • 在哪里添加我的 Route 53 子域 NS 记录?

    我有一个使用 namecheap 注册的域 其 DNS 记录由 AWS Route 53 管理 当前该域指向常规 EC2 实例 我想要设置一个指向单独的 EC2 实例 特别是 Elastic Beanstalk 实例 的子域 我已经设置了
  • Postgresql:备份所有表结构但仅备份少数数据表

    我有一个数据库 其中包含一些用于应用程序设置的表 其中列出了用户 部门 城市等 我想要这些表的结构和数据 因此 如果我获得新用户 备份将保存它 但也有一些历史数据和计算数据 这些数据来自其他来源 只能工作一段时间 然后就会过期 因此备份这些
  • 如何检测某个轴属于 matplotlib 中已关闭的窗口

    在 matplotlib 中 我在轴上保留一个引用 如果包含轴的窗口已关闭 我想打开一个新图形 我的想法是继续在图形上添加绘图 直到它关闭 然后我打开一个新图形 请注意 新绘图的创建是由另一个图中的事件触发的 如果它可以帮助您理解我想要做什
  • imshow 当您绘制数据而不是图像时。方面和范围之间的关系?

    我正在 matplotlib 中使用 imshow 绘制二维数据数组 我在尝试缩放结果图时遇到问题 数组的大小为 30x1295 点 但范围单位为 extent 130 130 0 77 如果我在没有范围的情况下绘制数组 我会得到正确的图
  • 对象不可订阅网络x

    import itertools import copy import networkx as nx import pandas as pd import matplotlib pyplot as plt edgelist pd read
  • SQLite 插入顺序与查询顺序?

    查询返回的行顺序是否与 SQLite 数据库表中的行插入顺序相同 如果是 这种行为是否一致 如果否 可以强制执行吗 我需要存储大约 500 行数据 并且需要不时进行排序 排序 插入之前 数据的顺序正确 鉴于表中的行数较少 这可能就是您所需要
  • 找不到“./mysql/user.MYD”(错误代码:2 - 没有这样的文件或目录)

    我已经使用 brew install mysql 在 Mac Os 10 13 上安装了 mysql 当尝试通过命令 mysql secure installation 按照brew的建议设置密码时 它会抛出错误 谁能指导我吗 先感谢您 当
  • 在 Windows 中写入错误日志的最佳位置在哪里?

    你会在哪里写入错误日志文件 比如说ErrorLog txt 在 Windows 中 请记住 该路径需要向基本用户开放以获得文件写入权限 我知道事件日志可能是写入错误的位置 但它适用于 用户 级别权限吗 编辑 我的目标是 Windows 20
  • NativeScript 应用程序的“Error-ReferenceError-ErrorEvent 未定义”

    我是 NativeScript 的新学习者 我正在按照 Coursera 上的视频教程使用 NativeScript 创建 Android 项目 并且我收到了由这部分代码引起的上述错误 process httpmsg service ts
  • C# 在解决方案中添加来自不同项目的用户控件

    我在一个单独的项目中创建了一个 UserControl 该项目位于我想要使用它的同一解决方案中 我的解决方案如下所示 如您所见 我参考了解决方案中的其他项目 但是 在frmWizard cs中 用户控件不会出现在工具箱中 当我在 Wizar
  • 将 bsearch 与字符串数组一起使用时出现问题

    我尝试在 C 中的字符串数组上使用 c 内置 bsearch 时遇到一些令人困惑的行为 这是代码 我知道您可以使用内置 strcmp 来搜索字符串数组 但我将 myStrCmp 包含在内以用于调试目的 因为我不知道它为什么不起作用 cons
  • 当路径改变时,如何获取谷歌地图中的多边形对象?

    我使用 API v3 在 Google 地图上动态创建了很多多边形 我没有它们的全局数组 我在创建后为每个事件分配事件 因为我需要跟踪用户对它们所做的更改 一切都很好 除了一件事 path polygon getPath Note that
  • System.OutOfMemory 被抛出。如何找到罪魁祸首?

    我正在使用 Visual C Express 2008 并且有一个在窗体上启动的应用程序 但使用具有委托显示函数的线程来处理基本上所有的处理 这样 在处理任务时我的表单就不会锁定 最近 在经历多次重复过程后 程序处理传入数据 因此当数据进入
  • 以运行时可选择的精度打印浮点数

    这类似于这个问题 https stackoverflow com questions 10406493 ocaml printf sprintf但不完全相同 我天真地尝试过这个 let s prec string of int prec f
  • 10-15 分钟后浏览器崩溃

    在我的应用程序中 我显示 10 个图表 图表来自dygraphs http dygraphs com 监控数据 为了显示图表 我通过每 5 秒向 4 个 servlet 发送 ajax 请求来从我的服务器获取数据 10 15 分钟后 不知道
  • 在asp.net gridview中将控件添加到分页器的上一个/下一个右侧

    我试图在 asp net gridview 中的寻呼机的上一个 下一个右侧添加一个按钮控件 我尝试使用此网站上的示例 但我需要保留上一个 下一个并将按钮放在底部寻呼机行的右侧 起初 我得到了一个小的 5px 它显示在下一个单元格中 然后经过
  • 带有 MasterDetails 页面和导航的 Xamarin.forms

    我有一个应用程序 我希望有一个包含 2 个选项的母版页和每个详细信息页面的工具栏项目 例如 这里有一个设置页面作为我的详细信息页面 其中有两个收费项目保存和取消 这是用户必须输入必须保存的用户数据的形式 因此 单击 保存工具栏项目 时 我想
  • 我的函数应该返回指向 std::vector 的指针还是对 std::vector 的引用?

    我有一个std map