返回向量内对象的引用
Returning a reference of an object inside a vector
假设我有以下内容:
class Map
{
std::vector<Continent> continents;
public:
Map();
~Map();
Continent* getContinent(std::string name);
};
Continent* Map::getContinent(std::string name)
{
Continent * c = nullptr;
for (int i = 0; i < continents.size(); i++)
{
if (continents[i].getName() == name)
{
c = &continents[i];
break;
}
}
return c;
}
您可以在这里看到,continent
对象位于vector
内部,称为continents
。这是获得对象引用的正确方法吗?或者有更好的方法吗?vector是否存在潜在问题,导致其行为不端?
在一个条件下返回指向std::vector
内部对象的指针或引用是可以的:获取指针或引用后,矢量的内容不得更改。
当您在启动或构造函数中初始化向量时,这很容易做到,并且永远不会再更改它。在向量比通过值而不是指针返回的向量更动态的情况下,是一种更稳健的方法。
我建议您不要做类似的事情。std::vector做了一些奇特的内存处理方式,包括在数组容量不足时调整大小和移动数组,这将导致悬空引用。另一方面,如果映射包含一个常量向量,这意味着它保证不会被更改,那么您正在做的事情就会起作用。
谢谢Sudharshan
然而,如果您不介意使用更多的内存,忽略了序列将不再位于连续内存中,迭代器也不再是随机访问的事实,那么一个替代方案是使用std::list
而不是std::vector
。
调整大小时,std::list
不会使指向内部数据的指针或引用无效。指针/引用无效的唯一时间是删除指向/引用的项。
相关文章:
- 引用对象成员函数的成员函数
- 从 Base 引用对象调用派生类的成员
- 转换引用对象的边界框?
- 现代编译器会优化只引用对象子集的局部变量吗
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- 将 const 类型引用对象注册为类成员对象C++
- Boost Intervocess:通过迭代通过从结构引用对象的映射进行迭代时
- 无法用2D矢量成员引用对象
- 在由引用对象传递中访问由引用对象传递的变量
- 如何使用QString引用对象名称
- 使用自动迭代器引用对象
- C++ 在另一个对象中引用对象的当前状态
- 使用共享对象和引用对象进行引用计数
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 引用对象的动态类型何时可以更改
- 引用对象内部的指针
- C++从全局静态函数中引用对象
- C++如何仅在没有其他人直接或间接引用对象指针时删除该指针
- 如何使用C++引用对象
- 为什么引用对象仅保存特定类型的引用