#include<iostream>
#include<vector>
using namespace std;
int main()
{
int a[2]={1,2};
vector<int>::iterator it1,it2;
vector<int> ivec1(a,a+2);
vector<int> ivec2(a,a+2);
it1=ivec1.begin();
it2=ivec2.begin();
bool b=it1<it2;
system("pause");
return 0;
}
26 个解决方案
#1
迭代器严格来讲是逻辑上的指针,和那个单纯表示内存地址的指针还不完全一样。而且,比较两个不同vector对象的迭代其相互比较的结果是没有定义的,这样我也先不出有什么意义。
#2
楼主,把STL那章看完再说吧。
迭代器和指针,不是一回事.. 广义而已
迭代器和指针,不是一回事.. 广义而已
#3
据我说知:迭代器差不多是一个对象! 只不过是STL重载了++ --等运算符 对象是不能直接比较的吧 如果你喜欢 你可以试着参考stl 源码 自己重载 一下 不知道对不对!! 不要见怪。
#4
不是一回事,只是为了好理解,可以看成指针去用~
#5
不知道你看过STL源码没有,对于一般的容器来说迭代器和指针的确是两回事,但是对于vector来说,vector维护的是一个连续的线性空间,他的迭代器就是就是vector的value_type的指针
#6
同上。。。
#7
你说的比较对,但是vector的迭代器是这么定义的,typedef value_type* iterator;
所以说vector的迭代器其实就是指针,但是list和deque的迭代器的确单独定义了一个迭代器类
#8
指针也是迭代器,反之不行。
vector的迭代器可以认为是一个指针..
vector的迭代器可以认为是一个指针..
#9
广义的迭代器的确不能认为是指针,但对于vector来说,他的迭代器内部实现就是指针,所以我很奇怪,为什么指针能相互比较(还是那句话,可能没有任何意义),但是不同的vector的迭代器却不行(同一vector的迭代器自然可以比较)。
#10
求解答。。。。
#11
我不是说了 你需要按照stl源码重载那个运算符才可以的。
随便例子:
class Node
{
inta;
int b;
};
Node A;
Node B;
A > B 肯定是不行的 好吗?
他们类型也是一样的!
你在这个Class里面重载>符合之后也才能比较啊 不是同一个类型的数据就能比较!
#12
在这里你用两个指针指向这2个变量 之后就能比较了?
#13
我要比较的是两个vector迭代器,vector迭代器是什么?vector并没有为他的迭代器专门定义一个类,而是直接
typedef value_type* iterator 这样说你明白么?所以vector的iterator就是指针,而比较指针还需要重载操作符么?不知道我这样说你明不明白
#14
你不要认为所有的迭代器都是某个类的对象,至少vector的迭代器不是,他就是一个赤裸裸的原型指针
#15
自顶求解答。。。
#16
// vector
bool operator<(const _Myt& _Right) const
{ // test if this < _Right
#if _HAS_ITERATOR_DEBUGGING
_Compat(_Right);
#else
_SCL_SECURE_VALIDATE(this->_Has_container() && this->_Same_container(_Right));
#endif /* _HAS_ITERATOR_DEBUGGING */
return (_Myptr < _Right._Myptr);
}
#if _HAS_ITERATOR_DEBUGGING
void _Compat(const _Myt& _Right) const
{ // test for compatible iterator pair
if (this->_Mycont == 0 || this->_Mycont != _Right._Mycont)
////判断两个向量的型类是否一致
{
_DEBUG_ERROR("vector iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}
#endif /* _HAS_ITERATOR_DEBUGGING */
#17
我不知道你看过几个stl的实做,但是有一件事情你得知道
stl是标准,不代表任何一个库的实做
所以不同编译器的stl,性能的表现可以差很远
早期,这种现象尤其严重(看看vc6.0自带的和sgi stl的性能差距)
effective stl item 16
vector的iterator一般上是pointer
但他们并非总是pointer
#18
iterator的比较操作符是有限制的。
9.2. Iterators and Iterator Ranges
Table 9.3. Common Iterator Operations
iter1 == iter2
iter1 != iter2
Compare two iterators for equality (inequality). Two iterators are equal if they refer to the same element of the same container or if they are the off-the-end iterator (Section 3.4, p. 97) for the same container.
Table 9.4. Operations Supported by vector and deque Iterators
>, >=, <, <=
Relational operators on iterators. One iterator is less than another if it refers to an element whose position in the container is ahead of the one referred to by the other iterator. The iterators must refer to elements in the same container or one past the end of the container.
Supported only for vector and deque.
9.2. Iterators and Iterator Ranges
Table 9.3. Common Iterator Operations
iter1 == iter2
iter1 != iter2
Compare two iterators for equality (inequality). Two iterators are equal if they refer to the same element of the same container or if they are the off-the-end iterator (Section 3.4, p. 97) for the same container.
Table 9.4. Operations Supported by vector and deque Iterators
>, >=, <, <=
Relational operators on iterators. One iterator is less than another if it refers to an element whose position in the container is ahead of the one referred to by the other iterator. The iterators must refer to elements in the same container or one past the end of the container.
Supported only for vector and deque.
#19
嗯 。只有来自同一个容器的两个未失效的迭代器才能作较。
#20
忘记说了上面的内容来自
C++ Primer, Fourth Edition
C++ Primer, Fourth Edition
#21
明白了,我看的是sgi stl标准,结果一看vs2008的,傻眼了。。。的确实现不一样。。。受教
#22
受教受教。。。我看的是sgi stl版本,但是用的vs2008,他的vector是的iterator是定义了自己的类的,谢谢大家了
#23
已经明白了,看来还是C++primer厉害,谢谢了
#24
vector<int> 这样才算是类型吧
#25
我对你表示羡慕嫉妒恨
#26
太感谢了,遇到这个问题,找了半天原因,第二天才想起来是不是只能在同一个容器内比较。看来还是看书不认真啊!
#1
迭代器严格来讲是逻辑上的指针,和那个单纯表示内存地址的指针还不完全一样。而且,比较两个不同vector对象的迭代其相互比较的结果是没有定义的,这样我也先不出有什么意义。
#2
楼主,把STL那章看完再说吧。
迭代器和指针,不是一回事.. 广义而已
迭代器和指针,不是一回事.. 广义而已
#3
据我说知:迭代器差不多是一个对象! 只不过是STL重载了++ --等运算符 对象是不能直接比较的吧 如果你喜欢 你可以试着参考stl 源码 自己重载 一下 不知道对不对!! 不要见怪。
#4
不是一回事,只是为了好理解,可以看成指针去用~
#5
不知道你看过STL源码没有,对于一般的容器来说迭代器和指针的确是两回事,但是对于vector来说,vector维护的是一个连续的线性空间,他的迭代器就是就是vector的value_type的指针
#6
同上。。。
#7
你说的比较对,但是vector的迭代器是这么定义的,typedef value_type* iterator;
所以说vector的迭代器其实就是指针,但是list和deque的迭代器的确单独定义了一个迭代器类
#8
指针也是迭代器,反之不行。
vector的迭代器可以认为是一个指针..
vector的迭代器可以认为是一个指针..
#9
广义的迭代器的确不能认为是指针,但对于vector来说,他的迭代器内部实现就是指针,所以我很奇怪,为什么指针能相互比较(还是那句话,可能没有任何意义),但是不同的vector的迭代器却不行(同一vector的迭代器自然可以比较)。
#10
求解答。。。。
#11
我不是说了 你需要按照stl源码重载那个运算符才可以的。
随便例子:
class Node
{
inta;
int b;
};
Node A;
Node B;
A > B 肯定是不行的 好吗?
他们类型也是一样的!
你在这个Class里面重载>符合之后也才能比较啊 不是同一个类型的数据就能比较!
#12
在这里你用两个指针指向这2个变量 之后就能比较了?
#13
我要比较的是两个vector迭代器,vector迭代器是什么?vector并没有为他的迭代器专门定义一个类,而是直接
typedef value_type* iterator 这样说你明白么?所以vector的iterator就是指针,而比较指针还需要重载操作符么?不知道我这样说你明不明白
#14
你不要认为所有的迭代器都是某个类的对象,至少vector的迭代器不是,他就是一个赤裸裸的原型指针
#15
自顶求解答。。。
#16
// vector
bool operator<(const _Myt& _Right) const
{ // test if this < _Right
#if _HAS_ITERATOR_DEBUGGING
_Compat(_Right);
#else
_SCL_SECURE_VALIDATE(this->_Has_container() && this->_Same_container(_Right));
#endif /* _HAS_ITERATOR_DEBUGGING */
return (_Myptr < _Right._Myptr);
}
#if _HAS_ITERATOR_DEBUGGING
void _Compat(const _Myt& _Right) const
{ // test for compatible iterator pair
if (this->_Mycont == 0 || this->_Mycont != _Right._Mycont)
////判断两个向量的型类是否一致
{
_DEBUG_ERROR("vector iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}
#endif /* _HAS_ITERATOR_DEBUGGING */
#17
我不知道你看过几个stl的实做,但是有一件事情你得知道
stl是标准,不代表任何一个库的实做
所以不同编译器的stl,性能的表现可以差很远
早期,这种现象尤其严重(看看vc6.0自带的和sgi stl的性能差距)
effective stl item 16
vector的iterator一般上是pointer
但他们并非总是pointer
#18
iterator的比较操作符是有限制的。
9.2. Iterators and Iterator Ranges
Table 9.3. Common Iterator Operations
iter1 == iter2
iter1 != iter2
Compare two iterators for equality (inequality). Two iterators are equal if they refer to the same element of the same container or if they are the off-the-end iterator (Section 3.4, p. 97) for the same container.
Table 9.4. Operations Supported by vector and deque Iterators
>, >=, <, <=
Relational operators on iterators. One iterator is less than another if it refers to an element whose position in the container is ahead of the one referred to by the other iterator. The iterators must refer to elements in the same container or one past the end of the container.
Supported only for vector and deque.
9.2. Iterators and Iterator Ranges
Table 9.3. Common Iterator Operations
iter1 == iter2
iter1 != iter2
Compare two iterators for equality (inequality). Two iterators are equal if they refer to the same element of the same container or if they are the off-the-end iterator (Section 3.4, p. 97) for the same container.
Table 9.4. Operations Supported by vector and deque Iterators
>, >=, <, <=
Relational operators on iterators. One iterator is less than another if it refers to an element whose position in the container is ahead of the one referred to by the other iterator. The iterators must refer to elements in the same container or one past the end of the container.
Supported only for vector and deque.
#19
嗯 。只有来自同一个容器的两个未失效的迭代器才能作较。
#20
忘记说了上面的内容来自
C++ Primer, Fourth Edition
C++ Primer, Fourth Edition
#21
明白了,我看的是sgi stl标准,结果一看vs2008的,傻眼了。。。的确实现不一样。。。受教
#22
受教受教。。。我看的是sgi stl版本,但是用的vs2008,他的vector是的iterator是定义了自己的类的,谢谢大家了
#23
已经明白了,看来还是C++primer厉害,谢谢了
#24
vector<int> 这样才算是类型吧
#25
我对你表示羡慕嫉妒恨
#26
太感谢了,遇到这个问题,找了半天原因,第二天才想起来是不是只能在同一个容器内比较。看来还是看书不认真啊!