矢量元素是否保证有序?

时间:2013-02-10 14:25:06

标签: c++ vector

我理解指向向量元素的指针是一个坏主意,因为在扩展时,所涉及的内存地址将发生变化,从而使指针无效。但是,如果我只是使用一个包含我想要访问的元素的索引号的整数呢?随着向量增长,这会失效吗?我在想什么看起来像这样:

    #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 个答案:

答案 0 :(得分:5)

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

vector: 3 5 1 6 7 4

此处vector[2] == 1。但是如果你删除vector[1](5),然后删除vector[2] == 6

答案 1 :(得分:2)

我认为你问题的标题和你似乎要问的内容并不匹配。根据定义,没有向量保证被排序,因此元素将不是“按顺序”。

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

存储索引只会受到潜在的逻辑失效的影响:如果您将元素插入到之前位置的向量中,那么元素就是索引将向右移动一个位置,同一索引现在将引用不同的元素;同样,如果你在索引的位置之前擦除一个元素,你索引的元素将在左侧位置移动 - 你的索引现在可能指的是一个超出界限的位置。

答案 2 :(得分:0)

它不应该,因为系统将简单地分配更多的内存,然后进行记忆。

订单应保存在std :: vector STL模板中。

是的,如果删除元素,顺序将会改变。但是,如果您要进行大量删除操作,请使用其他数据结构,例如链接列表。

答案 3 :(得分:0)

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