向量元素是否保证有序

Are vector elements guaranteed to be in order?

本文关键字:元素 是否 向量      更新时间:2023-10-16

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

    #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;}

否,当矢量展开时,索引号当然不会无效。如果你删除了以前的元素,它们就会失效(从某种意义上说,你不再在一个不变的索引中找到相同的元素)

vector: 3 5 1 6 7 4

这里是vector[2] == 1。但如果您擦除vector[1](5),然后再擦除vector[2] == 6

我认为你的问题的标题和你似乎在问的问题并不匹配。根据定义,没有向量可以保证排序,所以元素不会"有序"。

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

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

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

这不应该,因为系统只会分配更多的内存,然后进行memcopy。

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

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