返回向量内对象的引用

时间:2015-11-07 01:54:14

标签: c++ pointers reference

假设我有以下内容:

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;
}

您可以在此处看到有continentvector个对象位于名为continents的{​​{1}}内。这是获取对象引用的正确方法,还是有更好的方法?向量是否存在潜在问题会导致行为不端?

3 个答案:

答案 0 :(得分:1)

我会建议你不要像上面这样做。 std :: vector做了一些处理内存的奇特方法,包括调整大小并在数组超出容量时移动数组,这将导致悬空引用。另一方面,如果地图包含一个const向量,这意味着它保证不会被改变,那么你正在做的事情会起作用。

由于 Sudharshan

答案 1 :(得分:1)

可以在一个条件下返回std::vector内对象的指针或引用:在获取指针或引用后,向量的内容不得更改。

在启动时或在构造函数中初始化向量时,这很容易实现,并且永远不会再次更改它。在向量比通过值而不是通过指针返回的向量更动态的情况下,是一种更健壮的方法。

答案 2 :(得分:1)

其他人指出,设计存在缺陷。

但是,如果您不介意使用更多内存,请忽略序列不再位于连续内存中的事实,并且迭代器不再是随机访问,那么直接替换将是使用std::list代替std::vector

调整大小时std::list不会使指针或对内部数据的引用无效。指针/引用无效的唯一时间是删除指向/引用的项目。