代码之家  ›  专栏  ›  技术社区  ›  MartinStettner

指向std::vector和std::list元素的指针

  •  29
  • MartinStettner  · 技术社区  · 16 年前

    std::vector 带着某种阶级的元素 ClassA . 另外,我想使用 std::map<key,ClassA*> 它将一些键值映射到指向向量中包含的元素的指针。

    补充 在向量的末尾(不是 插入 ). 即,以下代码是否正确:

    std::vector<ClassA> storage;
    std::map<int, ClassA*> map;
    
    for (int i=0; i<10000; ++i) {
      storage.push_back(ClassA());
      map.insert(std::make_pair(storage.back().getKey(), &(storage.back()));
    }
    // map contains only valid pointers to the 'correct' elements of storage
    

    如果我使用 std::list 标准::向量 ?

    7 回复  |  直到 16 年前
        1
  •  26
  •   DumbCoder    16 年前

    向量-否。因为向量的容量永远不会缩小,所以即使元素被删除或更改,只要引用、指针和迭代器引用的位置在被操纵的元素之前,就可以保证这些引用、指针和迭代器仍然有效。但是,插入可能会使引用、指针和迭代器无效。

    列表-是的,插入和删除元素不会使指向其他元素的指针、引用和迭代器无效

        2
  •  9
  •   SadSido    16 年前

        3
  •  7
  •   Community Mohan Dere    9 年前

    使用 std::deque push_back() 已使用。

    注意:元素的迭代器可能无效!指向元素的指针不会。

    C++ deque's iterator invalidated after push_front()

        4
  •  3
  •   sbi    16 年前

    我不确定是否能保证,但实际上 storage.reserve(needed_size) 应该确保没有重新分配发生。


    通过将索引添加到begin迭代器,可以很容易地将索引转换为迭代器( storage.begin()+idx &*(storage.begin()+idx) ).

        5
  •  1
  •   sbi    16 年前

    std::vector<ClassA*> storage;
    std::map<int, ClassA*> map;
    
    for (int i=0; i<10000; ++i) {
      ClassA* a = new ClassA()
      storage.push_back(a)
      map.insert(std::make_pair(a->getKey(), a))
    }
    // map contains only valid pointers to the 'correct' elements of storage
    
        6
  •  1
  •   David Rodríguez - dribeas    16 年前

    从一个注释到另一个答案,您似乎只需要集中(简化)内存管理。如果真是这样,您应该考虑使用像 boost pointer container 库并尽可能简单地保存自己的代码。

    特别是看看 ptr_map

        7
  •  0
  •   Nakul Vaidya    8 年前
    1. 矢量编号。
    2. 是的。 怎样? 迭代器用作指向列表中特定节点的指针。 所以你可以给任何结构赋值,比如:

      列出我的列表;

      配对<列表::迭代器,int>临时雇员;

      temp=配对(mylist.begin(),x);