返回向量内对象的引用

Returning a reference of an object inside a vector

本文关键字:引用 对象 向量 返回      更新时间:2023-10-16

假设我有以下内容:

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不会使指向内部数据的指针或引用无效。指针/引用无效的唯一时间是删除指向/引用的项。