学习C++ STL时遇到的小疑问

来源:百度知道 编辑:UC知道 时间:2024/05/04 17:35:20
#include <iostream>
#include <deque>

using namespace std;

int main()
{
deque<int> test;
//test.push_front( 1 );
test[ 0 ] = 1;
cout << test[ 0 ] << endl;
cout << test.size() << endl;
return 0;
}

我不明白的是:

deque类对象test明明靠直接访问( test[ 0 ] = 1 )就能赋值,为何还要用push_front()呢?但为什么直接使用test[ 0 ] = 1会造成cout << test.size() << endl;的结果为0?test明明含有一个元素,应该为1才对啊?

我再来回答一下~~

这个程序确实编译通过但是不能运行(VC6下),首先test[ 0 ] = 1只是一个赋值操作,他不会管有没有内存空间,所以使用这条语句之前一定要为其分配内存空间,比如说加一句:test.resize(10,0)。否则编译通过也运行不了。而push系列的操作首先在队列里会为其分配一块内存空间,然后将数值放进去。所以他并不需要提前用别的语句分配内存。

不用push_front没有在test中开辟出存储空间。
test.size()当然是0了,没有存东西的test当然也就没有test[0]这个了。

你这样想一下,test[ 0 ] = 1 是把test里面的第一个元素赋值为1,但问题是这个容器里面还没有任何元素呢,“test明明含有一个元素”这句话从何而来呢
比如在push_back或push_front以及其他的一些比如构造操作后才会有元素的,而下标操作符返回的是指向元素的引用

这个程序只是编译通过了,运行不起来的(用VC++6.0 VS.NET2003试过)
test[0] = 1;
会发生运行时错误,因为 STL 还没有为 test[0] 分配内存空间
test[0] 的分配时机是第一次调用 test.push_front()
test[1] 的分配时机是第二次调用 test.push_front()
test[2] 的分配时机是第三次调用 test.push_front()
...
如果提前就把 test[n] 都分配好了,那么 test.size() 就是无穷大了
如果由于使用 test[3] = 3; 而导致 test[0], test[1], test[2] 都被分配,会令人难以理解(因为 deque 是一种只能对头尾进行操作的数据结构)

如果楼主用的是更高级的编译器,或许就需要更高级的解释了^_^