2016-12-05 10 views
0

私はベクトルが与えられた場所でイテレータを使ってベクトルの最初と最後の数を比較し、次のものに移動して比較します。私はそれを行うためのforループを書いたが、ベクトルの中心に達すると停止させる方法がわからない。 aが前方イテレータで、bが後方イテレータであるC++での比較のためにベクトルを反復する

for (a = v.begin(), b = v.rbegin(); a != v.end(), b != v.rend(); a++, b++) 

:私は、forループのために

。 私は、forループの条件を変更する必要があると仮定していますが、私は何がわかりません。

+0

あなたは、いくつかの「is_palindrome」関数を意味ですか? – xtofl

+1

少なくとも、&&を使用するように条件を変更する必要があります。 – Iluvatar

+0

あなたのループ条件 'a!= v.end()、b!= v.rend()'は両方の部分式を実行するためにコンマ演算子を使いますが、最初の(a!= v.end() ')は捨てられ、2番目の式の結果だけが使用されます。 「ベクトルの中心に到達する」に関しては、イテレータの代わりに*インデックス*を使用する方が意味があるかもしれません。次に、インデックスがベクトル長の「中間点」を通過するかどうかを確認するのは簡単です。 –

答えて

1

std::vector<T>::iteratorrandom-access iteratorです。つまり、operator<が定義されています。これを使用する

、およびstd::reverse_iterator<Iterator>::base()メンバ関数を使用して、我々は次のようにforループあなたを書き換えることができます。

auto a = v.begin(); 
auto b = v.rbegin(); 
for (; a < b.base(); ++a, ++b) 
{ 
    // Do stuff... 
} 
1

あなたが比較して&&なく,演算子を使用する必要がまず第一に、どのあなたが思っていることはしません。

あなただけの両方のイテレータがお互いに到達するまで、あなたは base()を通じて std::reverse_iteratorの基礎となる std::iteratorを得ることができます続けるあなたの具体的な質問については

、例えば:

template<typename T> bool isPalindrome(const std::vector<T>& data) 
{ 
    for (auto it = data.begin(), it2 = data.rbegin(); it != data.end() && it2 != data.rend() && 
      it != it2.base(); ++it, ++it2) 
     if (*it != *it2) 
      return false; 

    return true; 
} 
関連する問題