指向std::vector元素的指针

Pointer to element of std::vector

本文关键字:指针 元素 vector std 指向      更新时间:2023-10-16

比如

struct functor
{
  functor(){}
  virtual int operator()()=0;
};
struct impl : public functor
{
  int i;
  impl(int ii) : i(ii) {}
  virtual int operator()(){return i;};
};
void call(functor& f) {std::cout << f() << std::endl;}
class holder
{
public:
  holder(){}
  std::vector<functor*> dps;
};
class veer
{
public:
  std::vector<holder> hs;
  std::vector<impl> ds;
  veer(){}
  void add_h(int i)
  {
    ds.push_back(impl(i));
    holder th;
    th.dps.push_back(&ds.back()); //here
    hs.push_back(th);
  }
};
int main()
{
  veer v;
  v.add_h(10);
  v.add_h(9);
  for (auto ih: v.hs)   
    for (auto ifn : ih.dps)
    call(*ifn);
  return 0;
}

此段错误。我很抱歉我不能让它更简单,这是最简单的,最接近我的实际代码。我需要指向函数对象的指针向量。我的猜测是,行标记//here我发送一个无效的指针,但除此之外,我仍然试图弄清楚这一点。

问题是vector不能保证保持相同的存储空间:

如果new size()大于capacity(),则所有迭代器和引用(包括过端迭代器)无效。否则,只有过末端迭代器失效。

每次调用add_h时,您可能会使存储在std::vector<functor*>中的所有指针无效。我想不出一个用例,有一个向量的东西和一个向量的指针,以相同的顺序。你确定这是你需要的吗?

std::vector倾向于按其所需的空间顺序使用某些东西,因此有时它需要扩展其存储空间。在底层,它必须创建一个新的数组,复制现有的元素,并删除旧的元素。当它这样做时,所有旧的指针现在都指向delete ed内存。