关于vector和list容器的有关问题
关于vector和list容器的问题
访问 vector 和list容器的时候出了点毛病
比如在list容器中
假设 lis为list容器对象,且以初始化
现在我要去最后一个元素
list<int>::reference va1 = *--lis.end();//这个没问题
但是 在vector中
假设 vec为vwctor容器对象,且以初始化
vector<int>::reference va2 = *--vec.end();//这个就报错 为什么呢?
------解决方案--------------------
《C++标准程序库》说道:vector中的iterator很可能采用普通的指针来实现,由于C++标准不准对一个临时指针进行算术运算,所以--vec.end()这种用法在部分实现上可能无法通过编译.相反,list和map等容器的迭代器绝对无法用普通指针来实现,所以总是自定义类型.为了使用的方便,库的实现者允许存在--lst.end()这种代码.
如果不理解前一句,可以看下面的示例:
------解决方案--------------------
修正一下,不是不准进行任何算术运算,是不能进行一个修改临时指针本身的算术运算.以免有人误会vec.end() - 1也不合法.
------解决方案--------------------
能把具体标准章节帖出来吗?
std::vector::iterator 是 random access iterator,后者是 bidirectional iterator,后者根据 24.2.6/1 table 110 要求,应该具有良好定义个 prefix -- operation。我试了三四个编译器,如下代码都能编译。
目测楼主编译器实现的 bug 了。
------解决方案--------------------
标准只是说,如果it是random access iterator,那么对it进行算术加减法、自增自减都可以。这些关于迭代器行为的约束都是在it是一个具名对象的前提下讨论的。--vec.end()明显不属于这种情形。
至于你要我贴标准章节,抱歉,我贴不出来。如果你对一个临时指针的自增自减不合法这一观点持怀疑态度的话,那同样也是在怀疑下面的代码。
------解决方案--------------------
谁说lis.end()是临时指针?list的迭代器绝对不会是原生指针类型。
------解决方案--------------------
访问 vector 和list容器的时候出了点毛病
比如在list容器中
假设 lis为list容器对象,且以初始化
现在我要去最后一个元素
list<int>::reference va1 = *--lis.end();//这个没问题
但是 在vector中
假设 vec为vwctor容器对象,且以初始化
vector<int>::reference va2 = *--vec.end();//这个就报错 为什么呢?
------解决方案--------------------
《C++标准程序库》说道:vector中的iterator很可能采用普通的指针来实现,由于C++标准不准对一个临时指针进行算术运算,所以--vec.end()这种用法在部分实现上可能无法通过编译.相反,list和map等容器的迭代器绝对无法用普通指针来实现,所以总是自定义类型.为了使用的方便,库的实现者允许存在--lst.end()这种代码.
如果不理解前一句,可以看下面的示例:
int func() { return 10; }
++func(); // 不合法
typedef T* iterator;
class vector { iterator end() { ; } };
--vec.end(); // 同样不合法,内置类型的临时值无法更改
------解决方案--------------------
修正一下,不是不准进行任何算术运算,是不能进行一个修改临时指针本身的算术运算.以免有人误会vec.end() - 1也不合法.
------解决方案--------------------
能把具体标准章节帖出来吗?
std::vector::iterator 是 random access iterator,后者是 bidirectional iterator,后者根据 24.2.6/1 table 110 要求,应该具有良好定义个 prefix -- operation。我试了三四个编译器,如下代码都能编译。
std::vector<int> vec;
std::vector<int>::reference va2 = *--vec.end();
目测楼主编译器实现的 bug 了。
------解决方案--------------------
标准只是说,如果it是random access iterator,那么对it进行算术加减法、自增自减都可以。这些关于迭代器行为的约束都是在it是一个具名对象的前提下讨论的。--vec.end()明显不属于这种情形。
至于你要我贴标准章节,抱歉,我贴不出来。如果你对一个临时指针的自增自减不合法这一观点持怀疑态度的话,那同样也是在怀疑下面的代码。
int func() { return 10; }
++func(); // 不合法
------解决方案--------------------
谁说lis.end()是临时指针?list的迭代器绝对不会是原生指针类型。
------解决方案--------------------