2013-02-10 157 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

相關問題