有一个对象引用的向量是否合法,如下所示?
vector<Agent&> seenAgents;
例如,某些但不是场景中的所有对象都填充了哪些?
我有一个Agent对象的向量,但上面列出的向量应仅包含对每个代理当前可以看到的对象的引用 - 这意味着将一直添加和删除引用。
这是语言允许的吗?此外,还有什么我需要注意的吗?如果我从向量中删除引用它会持续存在吗?这是内存泄漏吗?
我似乎在声明向量的行上收到此错误:
error C2528: 'pointer' : pointer to reference is illegal
这是直接与线路有关还是最有可能发生在其他地方?它正在构造函数初始化列表中初始化,如下所示:
seenAgents(vector<Agents&>())
答案 0 :(得分:19)
您不能拥有vector
个引用,因为引用不是可复制 assignable和所有 STL容器应该存储 copyable < / strike>可分配项目。
但是你可以使容器保持指针。像这样:
vector< Agents* > seenAgents;
这有点危险。您需要确保这些指针仍然有效。我的意思是 - 如果有人删除了一个由该容器中的指针指向的对象,则该指针变为无效。您需要确保不会发生这种情况,因为您无法检查它(您无法检查NULL
,因为如果有人删除了指向的对象,指针将不会变为NULL
这里的最佳解决方案(由带有指针的容器提供)将使用一些智能指针 - 例如一些具有引用计数;他们将保证对象将存在并且指针有效。如果智能指针指向的对象被销毁,您可以检查NULL
。
答案 1 :(得分:8)
答案 2 :(得分:2)
我想要类似的功能。最后,这就是我所做的:
template <class T> class VectorOfRefs : public std::vector<T *> {
public:
inline T & at( const uint64_t i ) {
T * x = std::vector<T *>::at( i );
return *x;
}
};
VectorOfRefs < MyType > myVector;
myVector.push_back( &myInstance0 );
myVector.push_back( &myInstance1 );
// later in the code:
myVector.at( i ).myMethod();
显然,这是封面下方的指针向量。
通常我会使用STL并解决myVector.at( i )->myMethod()
,但我想使用++运算符,所以我有以下两个选项:
// using STL:
(*myVector.at(i))++;
// or, using my wrapper:
myVector.at( i )++;
我发现包装器的符号在代码可读性方面更为可取。我本身并不喜欢包装纸,但它会在以后支付股息。
答案 3 :(得分:0)
您可以在C ++ 11中改用std::reference_wrapper
:
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;
}
https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper