c ++ empty std :: vector begin不等于end

时间:2016-04-08 16:00:32

标签: c++ vector windows-10 std

嗨我在Windows 10上有这种情况,它声明了空类成员变量向量,但是这个向量的begin()(first iterator)end()(last iterator)不同,正如我在空向量中知道那些2应该是相同的。有任何想法吗? :)))

struct B  
{  
    std::string a;  

    std::string b;  
};

class A
{  
    A();  

    std::vector<B> vec_;    
};  

A::A()  
{

}

此处的结构函数A vec_.begin().base()不等于vec_.end().base()

据我所知,应该是平等的

3 个答案:

答案 0 :(得分:3)

标准只要求迭代器相等,它们的地址是相同的。考虑到迭代器的地址是没有意义的。

正如其他人所说,两个迭代器是不同的对象,所以需要来拥有不同的地址。

供参考,请参阅this answer

答案 1 :(得分:1)

std::vector<int> v;
assert(v.begin() == v.end());

这应该有效:开始和结束比较相等。

另一方面

auto b = v.begin();
auto e = v.end();
assert(&b == &e);

禁止工作:两个迭代器是不同的对象,必须有不同的地址。

比较等效物:

int i = 42;
int j = 42;
assert(i == j);   // ok
assert(&i == &j); // fail

答案 2 :(得分:0)

迭代器按值返回,因此地址确实不一样。即使你这样做:

{{userHelper.uArr[taskData.tOwner]}}

const vector<whatever>::iterator &it1 = vect.begin(); const vector<whatever>::iterator &it2 = vect.begin(); it1的地址可以不同(并且将在许多实现中) - 即使使用了引用。

(请注意,在两者中使用it2都不是错误 - 同样的方法begin()将返回两个具有不同值的不同对象)