将“push_back”用于带有“get”函数C++的向量

Posted

技术标签:

【中文标题】将“push_back”用于带有“get”函数C++的向量【英文标题】:Using "push_back" for vector with "get" function C++ 【发布时间】:2020-05-22 16:17:40 【问题描述】:

我有一个名为“Region”的类,还有一个名为“Map”的类。 “Map”类有一个名为“regions”的“Region *”类型的向量作为成员。在“地图”类的 .cpp 文件中,我有一个“getRegions”函数,它返回这个“区域”向量。

在 main.cpp 中,我初始化了一个“Region *”,称为“australia”,然后尝试使用“getRegions”函数为向量调用“push_back”函数。我以前从未遇到过使用“push_back”的问题,但是当我测试这个“Region *”是否真的在“regions”向量中时,它总是返回为空。

CLion 编译和运行程序没有任何错误。将“push_back”函数与“get”函数一起调用有错吗?

这里是驱动代码。

int main() 
    Map map;
    Region *australia;

    map.getRegions().push_back(australia);

    if (map.getRegions().empty()) 
        std::cout << "Empty"; //always prints this for some reason, even though I just pushed it back
     else 
        std::cout << "Not Empty";
    

    return 0;

【问题讨论】:

请发帖minimal reproducible example。我的猜测是 getRegions通过引用返回。 map.getRegions().push_back(australia); -- 此代码不可能正确,因为您正在向向量添加未初始化的指针。 【参考方案1】:

如果没有看到您的所有代码,很难判断,但根据您显示的代码和描述的行为,我的猜测是您的函数看起来像:

auto Map::getRegions() -> std::vector<Region>

  // ...
  return regions;

这意味着您正在制作向量的副本,并且您正在 push_backing 复制。

相反,你需要这样写:

auto Map::getRegions() -> std::vector<Region> &

  // ...
  return regions;

以便您返回对regions 成员的引用。

【讨论】:

原来是这样的:std::vector&lt;Region *&gt; Map::getRegions() return regions; 但现在我加了和号:std::vector&lt;Region *&gt; &amp;Map::getRegions() return regions; 嗯,好的,但考虑不使用指针。它们是错误的来源,因此除非必要,否则请避免使用它们。【参考方案2】:

阅读按值传递、按引用传递和按指针传递的概念。您的函数getRegions 可能正在按值返回成员 意思是,您正在创建一个临时副本,并将australia 添加到副本中,而不是实际成员。

【讨论】:

以上是关于将“push_back”用于带有“get”函数C++的向量的主要内容,如果未能解决你的问题,请参考以下文章

std :: vector是否将其值类型的赋值运算符用于push_back元素?

C++ - 没有匹配的成员函数调用“push_back”

如何在 C 语言中使用带有 REGS 结构的 int86 函数读取和显示文件数据,用于 8086

使用 fetch 发送带有数据对象的 get 请求

带有智能指针的 C++11 向量

学习 emplace_back() 和 push_back 的区别 emplace_back效率高