1

次のコードをコンパイルしようとすると、エラーが発生します。

  vector<string> articles;

  articles.push_back("Article 1...");
  articles.push_back("Article 2...");
  articles.push_back("Article 3...");
  articles.push_back("Article 4...");

  vector<string>::iterator beg = articles.begin(), end = articles.end();
  vector<string>::iterator mid = (end - beg) / 2;

mid を次のように変更した場合にのみコンパイルされます。

  vector<string>::iterator mid = articles.begin() + (end - beg) / 2;

初期化で何が.begin()変わる?

また、次のコードも中点を与えるべきではありませんか? (.begin() がないとコンパイルできないので追加)

  vector<string>::iterator mid = articles.begin() + articles.size() / 2;

同じ結果が得られます。

ありがとう。

4

1 に答える 1

5

end - begとの間の距離が得られます。これは数値であり、反復子ではありません。次に、それを 2 で割り、その距離の半分を取得します。そして、その距離を iterator に戻す必要があります。そのためにあなたはそれを追加しますbegendbeg

mid = beg + (end - beg) / 2

たとえば、ベクトルに 10 個の要素がある場合、 は(end - beg) / 2と評価され5ます。次に、ベクトルの 5 番目の要素を指す反復子を作成する必要があります。これは のように行われbeg + 5ます。

ベクトルのサイズの半分をベクトルの開始イテレータに追加することで同じ結果が得られると言っているのは正しいです。ただし、あなたが自分で言ったように、これは反復バイナリ検索アルゴリズムの一部です。つまり、midバイナリ検索の各反復で計算する必要があり、元のベクトルの先頭begend末尾を指しなくなります。これが、beg + (end - beg) / 2式が中間イテレータを計算するためのより用途の広い方法である理由です。

于 2013-07-07T16:15:56.027 に答える