假设我有以下内容:
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
的{{1}}内。这是获取对象引用的正确方法,还是有更好的方法?向量是否存在潜在问题会导致行为不端?
答案 0 :(得分:1)
我会建议你不要像上面这样做。 std :: vector做了一些处理内存的奇特方法,包括调整大小并在数组超出容量时移动数组,这将导致悬空引用。另一方面,如果地图包含一个const向量,这意味着它保证不会被改变,那么你正在做的事情会起作用。
由于 Sudharshan
答案 1 :(得分:1)
可以在一个条件下返回std::vector
内对象的指针或引用:在获取指针或引用后,向量的内容不得更改。
在启动时或在构造函数中初始化向量时,这很容易实现,并且永远不会再次更改它。在向量比通过值而不是通过指针返回的向量更动态的情况下,是一种更健壮的方法。
答案 2 :(得分:1)
其他人指出,设计存在缺陷。
但是,如果您不介意使用更多内存,请忽略序列不再位于连续内存中的事实,并且迭代器不再是随机访问,那么直接替换将是使用std::list
代替std::vector
。
调整大小时std::list
不会使指针或对内部数据的引用无效。指针/引用无效的唯一时间是删除指向/引用的项目。