对象引用的向量

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++:对象、对对象的引用、对带有和不带有函数的向量元素的引用——观察到的性能差异

对象引用的向量

Fragment 的 GetTag 返回空对象引用

引用、向量、std::vector::at 和易于使用的接口

包含引用的对象向量