1

これは非常にばかげた質問だと思いますが、これを明確にしたいと思いました。

1つの文字列ベクトルが次のようになっているとしましょう。

vector<int> vnTemp; // suppose this vector has {1,2,3,4,5}
vector<int>::iterator vn_it;

//Now, I want to print out only 1 to 4.
for(int i=0; i<4; ++i)
    cout << vnTemp[i] << endl;

非常に簡単です。しかし、イテレータを使用して同等の結果を出力したい場合はどうすればよいですか?たとえば、

// .. continuing from the code above
for(vn_it = vnTemp.begin(); vn_it != vnTemp.end()-1; ++vn_it)
    cout << *it << endl;

もちろん、vnTemp.end()-1ポインタなのでエラーになります。

この場合のforループに相当するものは何ですか?両方がoptimized(-o)モードでコンパイルされた場合、パフォーマンスに違いはありますか?


編集:

これが実際にで機能することに気づきましたvectorboost::tokenizer 私がコードを使用していたときに発生した問題は次のとおりです。

typedef boost::tokenizer<boost::char_separator<char> > tokenizer;

boost::char_separator<char> sep("_");
tokenizer::iterator tok_it;

tokenizer tokens(strLine, sep); //strLine is some string line
for(tok_it=tokens.begin(); tok_it != tokens.end(); ++tok_it){
... }

tokens.end()-1これは元のコードであり、forループで言おうとするとエラーが発生します。

この問題を解決する方法はありますか?あいまいさについて申し訳ありません。

4

1 に答える 1

3

boost::tokenizerフォワードイテレータのみを提供します。つまり、トークナイザーイテレーターから減算することはできません。ループで最後のトークンの処理を回避したい場合は、現在のトークンを処理する前に「先読み」する必要があります。このようなもの

tokenizer tokens(strLine, sep); //strLine is some string line
tok_it = tokens.begin();
if(tok_it!=tokens.end())
{
    ++tok_it;
    for(auto last_tok = tokens.begin(); tok_it != tokens.end(); ++tok_it){
        // Process last_tok here
        . . .
       last_tok = tok_it;    
    }
}

編集: 別のアプローチは、トークンをより柔軟なイテレータを備えたコンテナにコピーすることです。

std::vector<std::string> resultingTokens(tokens.begin(), tokens.end());
for(auto tok=resultingTokens.begin(); tok!=resultingTokens.end()-1; ++tok)
{
    // whatever
}
于 2012-05-08T22:50:25.897 に答える