对象引用的向量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象引用的向量相关的知识,希望对你有一定的参考价值。
拥有对象引用的向量是否合法,如下所示?
vector<Agent&> seenAgents;
例如,哪些会被场景中的一些但不是所有对象填充?
我有一个Agent对象的向量,但上面概述的向量应该只包含每个代理当前可以看到的对象 - 这意味着将一直添加和删除引用。
这是语言允许的吗?此外,还有什么我需要注意的吗?如果我从向量中删除引用它会持续存在吗?这是内存泄漏吗?
我似乎在声明向量的行上得到了这个错误:
error C2528: 'pointer' : pointer to reference is illegal
这是直接与线路有关还是最有可能发生在其他地方?它正在构造函数初始化列表中初始化,如下所示:
seenAgents(vector<Agents&>())
你不能有引用的vector
,因为参考不是
可复制
可分配和所有STL容器应该存储
可复制
可分配的项目。
但是你可以使容器保持指针。像这样:
vector< Agents* > seenAgents;
这有点危险。您需要确保这些指针仍然有效。我的意思是 - 如果有人删除了一个由该容器中的指针指向的对象,则指针变为无效。你需要确保这不会发生,因为你无法检查它(你不能检查NULL
,因为如果有人删除了指向的对象,指针将不会变成NULL
)。
这里的最佳解决方案(由带有指针的容器提供)将使用一些智能指针 - 例如一些具有引用计数;他们将保证对象将存在并且指针有效。如果智能指针指向的对象被破坏,您可以检查NULL
。
你不能这样做。使用指针。
Boost库提供PTR_VECTOR,这是一个比以下更好的解决方案:
vector<T*> foo;
我想要类似的功能。最后,这是我做的:
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 )++;
我发现包装器的符号在代码可读性方面更为可取。我本身并不喜欢包装纸,但以后它会带来好处。
您可以在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
以上是关于对象引用的向量的主要内容,如果未能解决你的问题,请参考以下文章
C++:对象、对对象的引用、对带有和不带有函数的向量元素的引用——观察到的性能差异