C++ 向量元素是否保证有序?

C++ 向量元素是否保证有序?,c++,vector,C++,Vector,我知道使用指向向量元素的指针是个坏主意,因为一旦扩展,涉及的内存地址就会改变,从而使指针失效。但是,如果我只是使用一个整数来保存我想要访问的元素的索引号,会怎么样?当向量变大时,这会失效吗?我的想法是这样的: #include <vector> class someClass{ string name public: string getName(){return name;} }; vector<someClass>

我知道使用指向向量元素的指针是个坏主意,因为一旦扩展,涉及的内存地址就会改变,从而使指针失效。但是,如果我只是使用一个整数来保存我想要访问的元素的索引号,会怎么样?当向量变大时,这会失效吗?我的想法是这样的:

    #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;}
#包括
上课{
字符串名
public:string getName(){return name;}
};
矢量vObj;
int currIdx;
字符串搜索;
时装研究;

对于(inti=0;i它不应该这样做,因为系统将简单地分配更多内存,然后执行memcopy

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


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

不应该这样,因为系统只需分配更多内存,然后执行memcopy

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


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

否,当向量展开时,索引号当然不会失效。它们是无效的(从某种意义上说,在常量索引中不再找到相同的元素)但是,如果删除上一个元素,请执行以下操作:

vector:35 16 7 4


在这里,
vector[2]==1
。但是如果您删除
vector[1]
(5),然后,
vector[2]==6
不,当向量展开时,索引号当然不会失效。它们会失效(从某种意义上说,您不再在常量索引中找到相同的元素)但是,如果删除上一个元素,请执行以下操作:

vector:35 16 7 4


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

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

否,展开向量时索引号不会无效。因为您正在声明vector容器对象不是指针
vector
,而不是
vector
,您的指向元素也将被保留。

我认为您的问题的标题和您似乎要问的内容并不真正匹配。根据定义,没有向量可以保证排序,因此元素不会“有序”

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


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

我认为您的问题的标题和您似乎要问的内容实际上不匹配。根据定义,没有向量可以保证排序,因此元素不会“有序”

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


存储索引只会导致潜在的逻辑失效:如果将元素插入到向量中,位置在您要索引的元素之前,则您要索引的元素将向右移动一个位置,并且同一索引现在将引用不同的元素;同样,如果您删除位置之前的元素您正在编制索引,您正在编制索引的元素将在位置上向左移动,并且您的索引现在可能引用了一个超出边界的位置。

是;假设您不删除任何项,向量项在向量中保持一致的位置。是;假设您已删除,向量项在向量中保持一致的位置不要删除任何项。好吧,如果我改为使用vector呢?这会不会以我不知道的方式改变vector的行为?我确实打算这样使用它,因为最终我打算将3个不同类的对象存储到一个vector中,所有这些类共享同一父类,因此我将使用向量,然后取消对我想要访问的对象的引用,并在执行我想做的任何操作之前将其转换回相应的类型。插入项(裸指针)在连续内存空间中重新分配数组,使指针无效。您可以使用共享或智能指针来实现此目的。请看
boost::shared_ptr
好的,如果我改用vector呢?这会以我不知道的方式改变向量的行为吗?我确实打算这样使用它,因为最终我打算将共享同一父类的3个不同类的对象撕成一个向量,因此我将使用类似于向量的东西,然后取消引用我要访问的对象,并将其重新转换为适当的类型bef