Iterの実装に基づいて、私は理解するのが難しく、operator!=
なぜそれがチェックされないのか理解できませんか_p_vec
?
operator!=
これは、を比較するだけの推奨実装です_pos
。
class Iter
{
public:
Iter (const IntVector* p_vec, int pos)
: _pos( pos )
, _p_vec( p_vec )
{ }
// these three methods form the basis of an iterator for use with
// a range-based for loop
bool operator!= (const Iter& other) const
{
return _pos != other._pos;
}
...
...
private:
int _pos;
const IntVector *_p_vec;
};
しかし、これを行う正しい方法は次のように思います。つまり、との両方を比較する必要が_pos
あり_p_vec
ます。
bool Iter::operator!= (const Iter& other) const
{
return _p_vec != other._p_vec || _pos != other._pos;
}
質問>誰のコードが正しいですか?
===イテレータの比較でstd::vectorがどのように機能するかを更新====
std::vector<int> vecOne { 1, 2, 3};
std::vector<int> vecTwo { 4, 5, 6};
auto iterOne = vecOne.begin();
std::advance(iterOne, 1);
auto iterTwo = vecTwo.begin();
std::advance(iterTwo, 1);
if ( iterOne == iterTwo)
std::cout << "iterOne == iterTwo" << std::endl;
else
std::cout << "iterOne != iterTwo" << std::endl;
出力は:iterOne != iterTwo
でも、
std::vector<int> foo;
std::vector<int> bar;
if ( foo.begin() == bar.begin() )
std::cout << "foo.begin() == bar.begin()" << std::endl;
else
std::cout << "foo.begin() != bar.begin()" << std::endl;
出力は:foo.begin() == bar.begin()
GCC(バージョン4.7.1)