拥有对象引用的向量是否合法,如下所示?
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.
你不能这样做.使用指针.
该升压库提供PTR_VECTOR比一个更好的解决方案:
vector<T*> foo;
Run Code Online (Sandbox Code Playgroud)
您可以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