迭代器与参考与指针

pmr*_*pmr 7 c++

我有一个类产生任意数量的工作对象,将其结果计算为std::vector.我将在某些点删除一些工作对象,但我希望将它们的结果保持在某个只有类已知的类别的顺序中spawned.因此,我在A类中为输出提供向量.

我有(IMO)三个选项:我可以指向矢量,引用或迭代器作为成员.迭代器选项有一定的缺点(迭代器可以递增.)我不确定指针或引用是否更清晰.我觉得引用更好,因为它们不能为NULL,并且cruncher需要存在向量.

我最不确定的是参考文献的有效性.它们会被某些操作无效std::list< std::vector<int> >吗?这些操作是否与使迭代器无效相同std::list?还有另一种我现在看不到的方法吗?此外,与容器的耦合感觉不对:我将特定容器强制到Cruncher类.

为清晰起见提供了代码

#include <list>
#include <vector>
#include <boost/ptr_container/ptr_list.hpp>

class Cruncher {
  std::vector<int>* numPointer;
  std::vector<int>& numRef;
  std::list< std::vector<int> >::iterator numIterator;
public:
  Cruncher(std::vector<int>*);
  Cruncher(std::vector<int>&);
  Cruncher(std::list< std::vector<int> >::iterator);
};

class A {
  std::list< std::vector<int> > container;
  boost::ptr_list< std::vector<int> > container2;
  std::vector<Cruncher> cruncherList;
};
Run Code Online (Sandbox Code Playgroud)

R S*_*hko 6

如果迭代器失效,它也会使迭代器转换为的指针/引用无效.如果你有这个:

std::vector<T>::iterator it = ...;
T *p = &(*it);
T &r = *p;
Run Code Online (Sandbox Code Playgroud)

如果迭代器无效(例如,对push_back的调用可能使所有现有的向量迭代器无效),则指针和引用也将失效.

从标准23.2.4.2/5(矢量容量):

注意:重新分配使引用序列中元素的所有引用,指针和迭代器无效.

std :: list使用相同的一般主体.如果迭代器无效,则转换为迭代器的指针和引用也将失效.

std :: list和std :: vector之间的区别是导致迭代器失效的原因.只要您不删除它所引用的元素,std :: list迭代器就是有效的.所以在哪里std::vector<>::push_back可以使迭代器无效,std::list<>::push_back不能.