向量元素是否保证按顺序排列?

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

2
是的,假设您不删除任何项,则向量条目在向量内保持一致的位置。 - Joe
4个回答

6
不,当向量扩展时,索引号当然不会失效。但是,如果您删除了先前的元素,它们就会失效(即您不再在恒定索引处找到相同的元素):
向量:3 5 1 6 7 4
在这里,vector [2] == 1。但是,如果您删除vector [1](5),那么之后vector [2] == 6。

3
我认为您的问题标题和实际询问内容并不匹配。按定义,没有任何一个向量保证有序,因此元素将不会“按顺序”排列。 此外,仅当发生重新分配时(即向量的大小超过其容量时),所有迭代器和对向量元素的引用才会失效。否则,在插入点之前的迭代器和引用不会失效(请参见C++11标准的第23.3.6.5 / 1段)。 存储索引只受潜在的逻辑无效影响:如果您在向量中插入元素在索引位置“之前”的位置,则您正在索引的元素将向右移动一个位置,同一索引现在将引用不同的元素;同样,如果您删除先于您正在索引的位置的元素,则您正在索引的元素将向左移动一个位置,并且您的索引现在可能会引用越界的位置。

1
你说得对,那是我的错。我的问题标题措辞不当。但还是感谢你回答了我的问题! - nullpointer

0

不应该,因为系统会简单地分配更多的内存,然后执行 memcopy 操作。

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

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


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

好的,如果我使用 vector<someClass*> 会怎样呢?这会改变vector的行为吗?我确实打算这样使用,因为最终我打算将3个不同类的对象,它们都共享相同的父类,存储到一个向量中,因此我将使用类似于 vector<someClass*> 然后解引用我想要访问的对象,并在执行任何我想要做的操作之前将其静态转换回适当的类型。 - nullpointer
插入项(裸指针)会重新分配连续的内存空间,从而使指针无效。您可以使用共享或智能指针来解决这个问题。请查看 boost::shared_ptr - Tyler Jandreau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接