C++空的STD::向量开始不等于结束

C++空的STD::向量开始不等于结束,c++,vector,windows-10,std,C++,Vector,Windows 10,Std,大家好,我在windows 10上遇到过这样的情况,它声明了空类成员变量vector,但这个向量的beginfirst迭代器和endlast迭代器不同,正如我所知,在空向量中,这两个变量应该是相同的。有什么想法吗 struct B { std::string a; std::string b; }; class A { A(); std::vector<B> vec_; }; A::A() { } 在

大家好,我在windows 10上遇到过这样的情况,它声明了空类成员变量vector,但这个向量的beginfirst迭代器和endlast迭代器不同,正如我所知,在空向量中,这两个变量应该是相同的。有什么想法吗

struct B  
{  
    std::string a;  

    std::string b;  
};

class A
{  
    A();  

    std::vector<B> vec_;    
};  

A::A()  
{

}
在构造函数中,vec_u2;.begin.base不等于vec_2;.end.base


据我所知,应该是相等的。标准只要求迭代器相等,而不是它们的地址相同。考虑迭代器的地址是没有意义的

正如其他人所说,这两个迭代器是不同的对象,因此它们需要有不同的地址

有关参考,请参阅

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

比较等效值:

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

迭代器是通过值返回的,因此地址实际上是不同的。即使你这样做了:

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


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

不要查看地址,只需比较它们即可。运算符==应该做正确的事情。标准没有声明它们将返回相同的迭代器,只是声明它们将比较相等。什么编译器?您将不得不发布一个完整的代码示例,该示例将此节目作为一些代码进行复制,该代码既不是最小的,也不是完整的。我想看到比较实际的代码,实际上是失败的,而不是一些描述它的文本。BASIC似乎并不是C++规范的一部分,至少对于从开始和结束返回的正则迭代器来说,MSVC 2013 C++ 11并不知道。但GCC似乎提供了作为不可移植扩展的base。是的,你是对的。我不清楚,迭代器是不同的。开始和结束的基是不相等的。vec.begin.base!=vec.end.base,应该是equal@Irakli达布阿什维利:你在说什么基地?在C++中,只有反向迭代器有基。非反向迭代器不会。vec.begin.base不可编译。显然,您的库实现允许您在非反向迭代器上调用base。这并不意味着你应该这样做。这并不意味着这些基的比较结果有任何特定的意义。好吧,你是对的,但是应该v.begin.base==v.end.base?std::vector::iterator甚至有一个基方法吗?我只知道反向迭代器的情况。如果你想要更多的帮助,现在你需要展示你的实际代码和平台,否则我们只是猜测。我也不知道,但它有这样的方法。检查stl_迭代器头文件,对我来说这听起来像是一个非标准的实现细节-我当然看不到任何类似的标准、我的本地头或任何在线引用。它们通常不按值返回,而是按值返回。是的,我知道,但我不清楚,开始和结束不同。这两位作家是不同的
int i = 42;
int j = 42;
assert(i == j);   // ok
assert(&i == &j); // fail
const vector<whatever>::iterator &it1 = vect.begin();
const vector<whatever>::iterator &it2 = vect.begin();