0

関数の定義advance()は次のとおりです。

template<class InIt, class Dist>
void advance(
        InIt& it, 
        Dist n
);

コードでこの関数を使用すると:

string strArr[10];
strArr[0] = string("dd");
strArr[1] = string("gg");
strArr[2] = string("tt");
const vector<string> vecStr(strArr, strArr+6);
advance(vecStr.begin(), 2);
cout<<*(vecStr.begin())<<endl; // the output is dd

function の最初のパラメーターadvance()が referenceであることはわかっているので、 afteradvance(vecStr.begin(), 2);verStr.begin()を指す必要がありvecStr[2]ます。しかし、出力からへのvecStr.begin()ポイントが見つかりますstr[0]

知りたいですよね?

4

4 に答える 4

2
advance(vecStr.begin(), 2);
cout<<*(vecStr.begin())<<endl; // the output is dd

2 つの異なるイテレータを使用しています。1 つはadvanceon で使用し、もう 1 つは印刷で使用します。

コードを機能させるには、同じイテレータでadvanceとを使用しますcout

auto iter = vecStr.begin();
advance(iter , 2);
cout << *iter << endl;

元のコードのコメントだけではadvance(vecStr.begin(), 2);、少なくとも厳密なコンパイラ設定を使用している場合、実際にはコンパイルされません。左辺値参照であるvecStr.begin()最初のパラメーターにバインドできない一時オブジェクトを返します。std::advance


また、std::vector::begin()ベクトルへの参照ではなく、ベクトル内の実際の begin イテレータのコピーを論理的に返します。これは、返された反復子に対して何を行っても、ベクター内の開始反復子には反映されないことを意味します。ここではイテレータについて話しているのであって、イテレータが指す要素についてではありません。

于 2013-08-10T04:11:38.483 に答える
1

std::advance下のイテレータは変更されず、一時的なイテレータstd::vectorでの進行も変更されません

// this will advance on a temporary iterator returned from vecStr.begin()
// it shouldn't compile as C++ doesn't allow bind reference to temporary object
advance(vecStr.begin(), 2);  

コードをコンパイルできる理由は、Visual Sutdio エクステンション C4239 を使用しているためです。これはのエクステンションとしても知られています。

やったほうがいい:

auto biter = vecStr.begin();    // biter points to begin of vecStr
std::advance(biter, 2);         // advance biter by 2 position
std::cout<< *biter << std::endl;
于 2013-08-10T04:11:34.193 に答える
0

あなたのコードは、標準準拠のコンパイラでコンパイルされません。Visual Studio を使用していて、一時的な参照の取得について警告レベルが十分に高くないと思います。

vector::begin()イテレータへの参照を返しません。でイテレータを返します。一時を返します。std::advanceの最初のパラメーターは非 const 参照です。これらは、標準 C++ では、一時的な引数にバインドすることはできません。したがって、コードはコンパイルに失敗します。

しかし、これが許可されているVSでは、に実際に「保存」されているものではなく、一時オブジェクトを進めているため、これはあなたが望むことをしませんvector。結局のところ、avectorは実際にはこれらのものを保管しないかもしれません。それらは任意のデータから生成される可能性があります。したがって、 a にイテレータが含まれていない可能性があるため、 a のイテレータを単純に変更することはできませvectorん。vector

于 2013-08-10T04:22:27.680 に答える
0

vector::begin()イテレータを返す関数です。begin()返されるイテレータを変更しても、返されるものを変更することはできません。ベクトルの内容を変更することによってのみ、返されるものを変更できます。

代わりにこれを試してください:

auto it = vecStr.begin();
advance(it, 2);
cout<<*(it)<<endl;
于 2013-08-10T04:10:30.843 に答える