关于vector和list容器的有关问题

关于vector和list容器的问题
访问 vector 和list容器的时候出了点毛病

比如在list容器中 
假设 lis为list容器对象,且以初始化
现在我要去最后一个元素
list<int>::reference va1 = *--lis.end();//这个没问题

但是 在vector中
假设 vec为vwctor容器对象,且以初始化
vector<int>::reference va2 = *--vec.end();//这个就报错 为什么呢?

------解决方案--------------------
引用:
访问 vector 和list容器的时候出了点毛病

比如在list容器中 
假设 lis为list容器对象,且以初始化
现在我要去最后一个元素
list<int>::reference va1 = *--lis.end();//这个没问题

但是 在vector中
假设 vec为vwctor容器对象,且以初始化
vector<int>::referen……

《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也不合法.
------解决方案--------------------
引用:
引用:访问 vector 和list容器的时候出了点毛病

比如在list容器中 
假设 lis为list容器对象,且以初始化
现在我要去最后一个元素
list<int>::reference va1 = *--lis.end();//这个没问题

但是 在vector中
假设 vec为vwctor容器对象,且以初始化
v
由于C++标准不准对一个临时指针进行算术运算
……

能把具体标准章节帖出来吗?
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 了。
------解决方案--------------------
引用:
引用:引用:访问 vector 和list容器的时候出了点毛病

比如在list容器中 
假设 lis为list容器对象,且以初始化
现在我要去最后一个元素
list<int>::reference va1 = *--lis.end();//这个没问题

但是 在vector中
假设 vec为vw……

标准只是说,如果it是random access iterator,那么对it进行算术加减法、自增自减都可以。这些关于迭代器行为的约束都是在it是一个具名对象的前提下讨论的。--vec.end()明显不属于这种情形。

至于你要我贴标准章节,抱歉,我贴不出来。如果你对一个临时指针的自增自减不合法这一观点持怀疑态度的话,那同样也是在怀疑下面的代码。

int func() { return 10; }
++func();  // 不合法

------解决方案--------------------
引用:
那请问 vec.end() 和 lis.end() 返回的不都是临时指针吗?
那为什么list允许做--lis.end() 呢?

我想是不是因为list的链表关系呢?  还是vector数组有什么特殊限制?
我试了  在vector做 -1运算就合法

谁说lis.end()是临时指针?list的迭代器绝对不会是原生指针类型。
------解决方案--------------------
引用:
标准只是说,如果it是random access iterator,那么对it进行算术加减法、自增自减都可以。这些关于迭代器行为的约束都是在it是一个具名对象的前提下讨论的。--vec.end()明显不属于这种情形。

至于你要我贴标准章节,抱歉,我贴不出来。如果你对一个临时指针的自增自减不合法这一观点持怀疑态度的话,那同样也是在怀疑下面的代码。……