对象引用的向量

Sir*_*lot 15 c++

拥有对象引用的向量是否合法,如下所示?

vector<Agent&> seenAgents;
Run Code Online (Sandbox Code Playgroud)

例如,哪些会被场景中的一些但不是所有对象填充?

我有一个Agent对象的向量,但上面概述的向量应该只包含每个代理当前可以看到的对象 - 这意味着将一直添加和删除引用.

这是语言允许的吗?此外,还有什么我需要注意的吗?如果我从向量中删除引用它会持续存在吗?这是内存泄漏吗?

我似乎在声明向量的行上得到了这个错误:

error C2528: 'pointer' : pointer to reference is illegal
Run Code Online (Sandbox Code Playgroud)

这是直接与线路有关还是最有可能发生在其他地方?它正在构造函数初始化列表中初始化,如下所示:

seenAgents(vector<Agents&>())
Run Code Online (Sandbox Code Playgroud)

Kir*_*rov 20

您不能有vector引用,因为引用不是可复制的可分配的,并且所有 STL容器都应该存储可复制的可分配项.

但是你可以使容器保持指针.像这样:

vector< Agents* > seenAgents;
Run Code Online (Sandbox Code Playgroud)

这有点危险.您需要确保这些指针仍然有效.我的意思是 - 如果有人删除了一个由该容器中的指针指向的对象,则指针变为无效.您需要确保不会发生这种情况,因为您无法检查它(您无法检查NULL,因为NULL如果有人删除指向的对象,指针将不会成为).

这里的最佳解决方案(由带有指针的容器提供)将使用一些智能指针 - 例如一些具有引用计数; 他们将保证对象将存在并且指针有效.如果智能指针指向的对象被破坏,您可以检查它NULL.

  • 你确定引用不可复制吗?我原以为他们不可转让. (2认同)

Cyb*_*Guy 8

你不能这样做.使用指针.

升压库提供PTR_VECTOR比一个更好的解决方案:

vector<T*> foo;
Run Code Online (Sandbox Code Playgroud)

  • 为什么`ptr_vector`比`vector <T*>`更好.如果你说某些东西更好,那么其他东西就会描述你的指标. (2认同)

ber*_*kie 6

您可以std::reference_wrapper在 C++11 中使用:

std::reference_wrapper 是一个类模板,它将引用包装在可复制、可分配的对象中。它经常用作将引用存储在通常不能保存引用的标准容器(如 std::vector)中的机制。

例子:

#include <functional>
#include <vector>
#include <iostream>

int main(int argc, char *argv[])
{

  int a = 5;
  int b = 6;
  std::vector<std::reference_wrapper<const int>> v;
  v.push_back(a);
  v.push_back(b);

  for (const auto& vi: v)
  {
    std::cout << vi << std::endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper