ベクトルの消去操作

高洛峰
リリース: 2016-11-22 15:24:08
オリジナル
1638 人が閲覧しました

最近、本を読んでいるときに偶然詳細を発見しました。それは、vector の消去操作です。この消去操作には 2 つの形式があることは誰もが知っています。(1) 単一の要素を削除します。パラメーターは反復変数です。(2) 間隔要素を削除します。パラメーターは begin と end です。詳細は、単一の要素が削除されたときに発生する具体的な内容です。

例: このように初期化されたベクトルがあります。vector va{0,1,2,2,3,4,5}、ベクトル内の 2 に等しい要素を削除します。

通常、コードは次のように書かれます:

#include <vector>
 #include <iostream>

int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     std::vector<int> vb(va);     for (auto i = va.begin();i != va.end(); i++)     {         if (*i == 4)         {             i = va.erase(i);         }     }     for (auto i : va) { std::cout << i << "  "; }     return 0; }
ログイン後にコピー

一見何も問題はありませんが、結果は予想外です

ベクトルの消去操作

なぜこのような結果になるのでしょうか?よく考えてみると、if 条件が成立すると、ベクトルは削除操作を実行し、条件を満たすベクトル内の要素を削除するのがポイントです。消去操作を実行すると、戻り値は現在削除されているイテレータの次の位置を表します。その後、ループが再度繰り返されると、イテレータは 1 つ後ろに移動し、同じ要素は存在しません。削除されました。

正しいスペルを添付します:

#include <vector> #include <iostream>

int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     std::vector<int> vb(va);     auto iter = vb.begin();     while(iter!=vb.end())     {         if (iter != vb.end())         {             if (*iter == 4)             {                 iter = vb.erase(iter);             }             else 
            { iter++; }         }     }     for (auto j : vb)     {         std::cout << j << "  ";     }     return 0; }
ログイン後にコピー
#include <vector>  #include <iostream>


int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     for (auto i = va.begin();i != va.end(); )     {         if (*i == 4)         {             i = va.erase(i);         }         else { i++; }     }     for (auto i : va)     {         std::cout << i << "  ";     }     return 0; }
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!