1

私のテスト プログラムの目標は、以下のような文字列の単純なベクトルでセルを消去することです。プログラムが失敗します (セグメンテーション違反)。

static void display(std::vector<std::string> const &vec)
{
    std::vector<std::string>::const_iterator It = vec.begin();
    for (; It != vec.end(); ++It)
        std::cout << *It << " ";
    std::cout << std::endl;
}


int         main(void)
{
    std::vector<std::string> vec;
    size_t  index = 0;

    vec.push_back("Toto");
    vec.push_back("Titi");
    vec.push_back("Tata");
    vec.push_back("Tutu");

    display(vec);

    std::vector<std::string>::iterator It = vec.begin();

    for (size_t idx = 0; It != vec.end(); ++It, idx++)
        if (!(*It).compare("Tutu"))
            index = idx;

    vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end()); //Segmentation fault

    display(vec);

    getchar();
    return (0);
}

誰でも私を助けることができますか?よろしくお願いします。

4

3 に答える 3

5
vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end());

std::string実際の要素 (この場合は type ) を関数に渡す必要がありますerase

したがって、代わりにindexsomestring

于 2012-12-01T16:38:14.637 に答える
0

同等性をチェックしているので、次を使用してstd::removeください:

vec.erase( std::remove( vec.begin(), vec.end(), "Tutu" ),
           vec.end() );

これは標準的なイディオムです。何らかの理由で、ループを自分で作成する必要がある場合は、次のようにします。

std::vector<std::string>::const_iterator current = vec.begin();
while ( current != vec.end() ) {
    if ( *current == "Tutu" ) {
        current = vec.erase( current ) ;
    } else {
        ++ current;
    }
}

(繰り返しますが、標準的なイディオムです。)

于 2012-12-01T18:21:56.140 に答える
0
  • イテレータと自作インデックスを混在させてはなりません。イテレータのみを使用します。
  • コピーなどのアルゴリズム - 実際のコンテナー タイプから切り離したい場合に使用する外部アルゴリズムがあり、最適化されたジョブを実行するメンバー関数があります。あなたの場合、 vec erase はあなたのためにすべてを行います。見つかったイテレータを渡すだけです

    vec.erase(それ);

于 2012-12-01T17:40:42.447 に答える