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

4 に答える 4

5

いいえ、もちろん、ベクトルが拡張されてもインデックス番号は無効になりません。ただし、前の要素を消去すると、(一定のインデックスで同じ要素が見つからなくなるという意味で)無効になります。

vector: 3 5 1 6 7 4

ここで、vector[2] == 1。しかし、vector[1](5)を消去すると、その後、vector[2] == 6

于 2013-02-10T14:26:59.780 に答える
3

あなたの質問のタイトルとあなたが尋ねているように見えるものは実際には一致していないと思います。定義上、ソートが保証されているベクトルはないため、要素は「順番に」配置されません。

さらに、ベクトルの要素へのすべてのイテレータと参照は、再割り当てが発生した場合(つまり、ベクトルのサイズがその容量を超えた場合)にのみ、挿入時に無効になります。それ以外の場合、挿入ポイントの前のイテレータと参照は無効になりません(C ++11標準の23.3.6.5/1項を参照)。

インデックスの保存は、潜在的な論理的無効化の対象となるだけです。インデックスを作成するの位置で要素をベクトルに挿入すると、インデックスを作成していた要素が1つ右にシフトされ、同じインデックスが作成されます。別の要素を参照してください; 同様に、インデックスを作成していた位置より前の要素を消去すると、インデックスを作成していた要素が左にシフトされ、インデックスが範囲外の位置を参照するようになります。

于 2013-02-10T14:30:05.147 に答える
0

システムは単により多くのメモリを割り当ててからmemcopyを実行するため、そうすべきではありません。

順序はstd::vectorSTLテンプレートに保存する必要があります。

はい、要素を削除すると順序が変わります。ただし、多くの削除を行う場合は、リンクリストなどの別のデータ構造を使用してください。

于 2013-02-10T14:26:38.547 に答える
0

いいえ、ベクトルが展開されてもインデックス番号は無効になりません。ベクトルコンテナオブジェクトはのvector<someClass>代わりにポインタではないことを宣言しているのでvector<someClass*>、ポイントされた要素も保持されます。

于 2013-02-10T14:28:39.720 に答える