STL:vector扩容、销毁、与list和deque的区别

1、vector是怎么扩容的?

reserve()是容器预留空间,但并不真正创建元素对象。
resize()是改变容器的大小,并且创建对象。

两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。

vector<int> myVec;
myVec.reserve( 100 );     // 新元素还没有构造,
                          // 此时不能用[]访问元素
for (int i = 0; i < 100; i++ )
 {
     myVec.push_back( i ); //新元素这时才构造 
}
 
myVec.resize( 102 );      // 用元素的默认构造函数构造了两个新的元素
myVec[100] = 1;           //直接操作新元素
myVec[101] = 2;

2、vector、list、deque的区别?

vector:
1、地址空间是连续的;
2、没有容量限制、当存储内容超过当前空间,就自动扩容;
3、支持高效的随机访问;
4、支持高效的尾插、尾删,但其他位置的插入/删除操作效率低下。

扩充空间(不论多大)都应该这样做:
(1)配置一块新空间
(2)将旧元素一一搬往新址
(3)把原来的空间释放还给系统

list:
非连续存储结构,具有双链表结构,每个元素维护一对前向和后向指针,因此支持前向/后向遍历。

优点:
(1) 不使用连续内存完成动态操作。
(2) 在内部方便的进行插入和删除操作
(3) 可在两端进行push、pop。

缺点:
(1) 不能进行内部的随机访问。
(2) 相对于verctor占用内存多。

使用区别:
(1)需要高效的随即存取,不在乎插入和删除的效率,使用vector。
(2)需要大量的插入和删除,而不关心随机存取,则应使用list。
(3)需要随机存取,而且关心两端数据的插入和删除,则应使用deque。

deque:

deque是在功能上合并了vector和list。
优点:
(1) 随机访问方便。
(2) 在内部方便的进行插入和删除操作。
(3) 可在两端进行push、pop。

缺点:占用内存多
使用区别:

(1)需要高效的随即存取,而不在乎插入和删除的效率,使用vector。
(2)需要大量的插入和删除,而不关心随机存取,则应使用list。
(3)需要随机存取,而且关心两端数据的插入和删除,则应使用deque。

迭代器区别:
vector与deque的迭代器支持算术运算,list的迭代器只能进行++/–操作,不支持普通的算术运算。

vector中的iterator在使用后就释放了,但是链表list不同,它的迭代器在使用后还可以继续用;链表特有的。

ite=find(vec.begin(),vec.end(),88);
vec.insert(ite,2,77);  //迭代器标记的位置前,插入数据;
cout<<*ite<<endl;  //会崩溃,因为迭代器在使用后就释放了,*ite的时候就找不到它的地址了;

3、vector怎么销毁空间?

第一步:先产生一个和原先一样的临时对象
第二步:临时量调用swap()函数两者进行交换。
第三步:语句结束,临时量自动析构。
    vector<int>().swap(vec);
	/*
	vector<int>(vec).swap(vec);  ===>   vec.swap(vector<int>())
	*/

使用clear()和erase()两个函数只是清空元素,但不回收内存。

先使用clear()再使用swap(),释放空间并且回收内存。

发布了150 篇原创文章 · 获赞 280 · 访问量 32万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览