【问题标题】:C++ pass STL container items as referenceC++ 传递 STL 容器项作为参考
【发布时间】:2013-04-02 18:30:10
【问题描述】:

我有一张std::map<std::string, std::vector<MyClass>> 类型的地图。地图以这种方式填充,我创建了一个矢量并将其与一个 guid 作为一对放入地图中。然后我想调用一个函数,给它刚刚插入的向量,让它填充向量。看起来是这样的:

{
    std::string guid = "aGUID"
    std::vector<MyClass> vec_myClass(0);
    my_map[guid] = vec_myClass;
    std::vector<MyClass>& vec_ref = my_map[guid];

    FillVector(vec_ref);    
}

FillVector(std::vector<MyClass>& vec)  { vec.push_back(...); }

我认为 [] 运算符返回 my_map 中项目的引用,我可以将其提供给一个函数来使用它,但此时我的应用程序崩溃了。我将向量首先放入地图中(当它为空时),因为我想避免复制工作,因为函数 FillVector 将大量项目放入向量中。我的错误在哪里?通过引用函数来传递引用可能是错误的吗?或者有明显更好的解决方案吗?我更喜欢这里的引用而不是指针。谢谢,一切顺利。

【问题讨论】:

  • 一个人们可以尝试自己编译和运行的小测试用例是理想的,因为问题可能出在我们看不到的代码部分。
  • 周围的代码非常庞大,很难提取一个测试用例。是否有在线提供 C++ 测试用例的可能性(如 jsFiddle)?
  • 你是说 likie ideone.com 和 liveworkspace.org?

标签: c++ map reference


【解决方案1】:

所有代码都简化为:

{
    std::string guid = "aGUID"
    FillVector(my_map[guid]);    
}

顺便说一句。我认为您的问题似乎并不在这里,但是在代码中您没有向我们展示...

【讨论】:

  • 这种简化很好。我认为您是对的,错误在其他地方。首先,我让一切都使用指针而不是引用: std::map<:string std::vector>*> 。效果很好......
  • 在我的应用程序中,我实际上将 vec 的引用存储在一个提供 FillVector 方法的类中。也许我遇到问题是因为当类被销毁时引用被杀死?
  • 那是由map的生命周期控制的,引用的是map中作为value的vector,所以只要map是存活的,引用就有效。跨度>
  • 是的,好的。我正在重组我的算法。我只是努力避免复制“大”矢量对象。存储在向量中的 MyClass 对象携带大量数据,我想避免在我简单地将(完整)向量插入地图时复制这些数据。但是向量拷贝构造函数真的做了深拷贝吗?
  • 我不明白你的意思,如果你按照我在上面代码中强调的那样做并且函数接受引用,则不涉及复制。如果函数按值接受,那么将有一个副本(它将为向量中的所有项目调用复制构造函数。)
【解决方案2】:

std::map 运算符将在内部为键创建值(如果它不存在)。见this link。传递对函数的引用是可以的,问题似乎出在代码中的其他地方。

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2011-06-17
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2016-04-11
    • 2014-02-10
    相关资源
    最近更新 更多