3

我知道拥有指向向量元素的指针是一个坏主意,因为在扩展时,所涉及的内存地址会发生变化,因此会使指针无效。但是,如果我只是使用一个整数来保存我想要访问的元素的索引号呢?随着向量大小的增长,这会失效吗?我在想的是这样的:

    #include <vector>

    class someClass{
    string name
    public: string getName(){return name;}
    };

    vector<someClass> vObj;
    int currIdx;
    string search;
    cout<<"Enter name: ";
    cin>>search;

    for(int i=0; i<vObj.size(); i++){
      if(vObj[i].getName()==search)
         currIdx = i;}
4

4 回答 4

5

不,当向量扩展时,索引号当然不会失效。但是,如果您删除前一个元素,它们将无效(从某种意义上说,您不再在恒定索引处找到相同的元素):

vector: 3 5 1 6 7 4

在这里,vector[2] == 1。但是如果你删除vector[1](5),那么之后,vector[2] == 6.

于 2013-02-10T14:26:59.780 回答
3

我认为你的问题的标题和你似乎在问什么并不真正匹配。根据定义,没有向量保证被排序,因此元素不会“按顺序”。

此外,只有在发生重新分配时(即当向量的大小超过其容量时) ,所有迭代器和对向量元素的引用才会在插入时失效。否则,插入点之前的迭代器和引用不会失效(参见 C++11 标准的第 23.3.6.5/1 段)。

存储索引只会受到潜在的逻辑失效的影响:如果您将元素插入到向量中您正在索引的位置之前的位置,您正在索引的元素将向右移动一个位置,并且相同的索引现在将引用不同的元素;同样,如果您在索引位置之前擦除元素,则您索引的元素将在位置上向左移动 - 您的索引现在可能指的是超出范围的位置。

于 2013-02-10T14:30:05.147 回答
0

它不应该,因为系统会简单地分配更多的内存,然后做一个 memcopy。

顺序应保留在 std::vector STL 模板中。

是的,如果您删除元素,排序将会改变。但是,如果您要进行大量删除,请使用不同的数据结构,例如链表。

于 2013-02-10T14:26:38.547 回答
0

不,当向量展开时,索引号不会失效。由于您声明向量容器对象不是指针vector<someClass>而不是vector<someClass*>,因此您指向的元素也将被保留。

于 2013-02-10T14:28:39.720 回答