2013-02-10 107 views
1

我知道指向元素的向量是一个坏主意,因为在扩展时,涉及的内存地址会改变,因此使指针无效。然而,如果我只是简单地使用一个包含我想访问的元素的索引号的整数呢?随着矢量的大小增加,它会失效吗?什么我想看起来像这样:向量元素是否保证顺序?

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

是;假设您不删除任何项目,向量条目在向量内保持一致的位置。 – Joe 2013-02-10 14:26:37

回答

5

不,当矢量展开时,索引号当然不会失效。他们是无效的(在你再也找不到在恒定的指数相同元素的意义上),如果你删除以前的元素,但:

vector: 3 5 1 6 7 4

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

0

它不应该,因为系统只会分配更多的内存,然后做一个存储器复制。

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

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

0

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

+0

好的,如果我使用矢量来代替呢?这会以一种我不知道的方式改变载体的行为吗?我打算以这种方式使用它,因为最终我打算将3个不同类的对象(它们共享相同的父类)存储到一个向量中,因此我将使用类似于矢量的东西,然后解除引用对象I打算访问,并static_cast它回到适当的类型之前做任何我想做的事情。 – 2013-02-10 20:19:51

+0

插入项目(裸指针)将数组重新分配到连续的内存空间中,使指针无效。您可以为此使用共享或智能指针。看看'boost :: shared_ptr' – 2013-02-10 20:29:24

1

我认为你的问题的标题和你似乎要求的东西并不匹配。没有矢量按照定义保证被排序,所以元素不会“按顺序”。

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

存储的索引是唯一受潜在逻辑无效:如果插入元件到载体的位置之前到要索引之一,你被索引将被移位一个位置到所述元件正确,同一个索引现在指的是不同的元素;同样,如果在索引的位置之前擦除元素,则索引的元素将在位置上向左移动 - 并且您的索引现在可能指向超出边界的位置。

+0

你是对的,那是我的不好。我的问题标题很糟糕。但是,尽管如此,谢谢你回答! – 2013-02-10 20:20:45

相关问题