关于deque
- C/C++ code
#include<iostream>#include<deque>using namespace std;#include<iostream>#include<deque>using namespace std;int main(){ double value[]= {1,2,3,4,5,6,7}; deque<double> ddeque(value,value+7); ddeque.assign(value,value+7); int i; cout << "Intial contents in doubledeque"; for( i = 0; i < ddeque.size(); i ++) cout << ddeque[i]<<" "; ddeque.assign(4,22); cout << endl<<"After assign:"; for( i = 0; i < ddeque.size(); i++) cout << ddeque[i]<<" "; deque<double>::iterator itr = ddeque.begin(); ddeque.insert(itr+1,555); ddeque.insert(itr+1,666); cout <<endl<<"After insert:"; for( i = 0; i < ddeque.size(); i ++) cout << ddeque[i]<<" "; ddeque.erase(itr+2,itr+4); cout <<endl<< "After erase:"; for(i = 0; i < ddeque.size(); i ++) cout << ddeque[i]<<" ";system("pause"); return 0;}输出:
Intial contents in doubledeque1 2 3 4 5 6 7
After assign:22 22 22 22
After insert:22 555 666 22 22 22
After erase:22 555 666 22 请按任意键继续. . .
问题:
1.在vc98中,deque<double> ddeque(value,value+7);ddeque.assign(value,value+7);会报错,在其它编译器下正常?
2.insert后,结果为什么不是"22 666 555 22 22 22"?
3.erase后,结果为什么不是"22 555 22 22"?
[解决办法]
如果你使用vector的话,应该就是你想要的结果了
deque是双端队列,它插入元素不一定是“该元素后所有元素后移”,也可能是“该元素前所有元素前移”
也就是说,插入元素后,你应该重新获取所有正在使用的迭代器
以这个例子来说,我想,在你ddeque.insert(itr+1,555)后,迭代器itr已经不等于ddeque.begin()了,虽然它指向的内存位置没有变,但那个内存位置已经不是deque在概念上的首元素位置了
关于assian,请注意,它要求的输入为“两个迭代器”,而不是“两个指针”
诚然,在VS的某些版本(也许是所有版本?)中,迭代器就是指针,因此你可以用指针冒充迭代器输入给它,结果也算正确
但这不属于C++标准,就我所知,在某些编译器上,迭代器不是内存指针,因此,你写的代码只能算是利用了某些编译器的房规,不完全合乎C++标准,由此造成的问题需要多加注意
以上为个人分析,如有错误欢迎指教