C++--问题11--vector容器

C++--问题11--vector容器


      1.标准模板库容器类型      

       标准模板库容器类有两种类型,分别是顺序和关联。顺序容器可以提供对齐成员的顺序和随机访问,关联容器则是经过优化关键值访问他们的元素。所有的标准模板库都在namespace std 定义。

      2. vector容器

       STL中的vector是封装了动态数组的顺序容器。不过与动态数组不同的是,vector可以根据需要自动扩大容器的大小。具体策略是每次容量不够用时重新申请一块大小为原来容量两倍的内存,将原容器的元素拷贝至新容器,并释放原空间,返回新空间的指针。

       在原来空间不够存储新值时,每次调用push_back方法都会重新分配新的空间以满足新数据的添加操作。如果在程序中频繁进行这种操作,还是比较消耗性能的。

      3.频繁对vector调用push_back(),对性能的影响和原因:

       如果需要频繁插入,最好先指定vector的大小,因为vector在容器大小不够用的时候会重新申请一块大小为原容器两倍的空间,并将原容器的元素拷贝到新容器中,并释放原空间,这个过程是十分耗时和耗内存的。频繁调用push_back()会使得程序花费很多时间在vector扩容上,会变得很慢。这种情况可以考虑使用list。

        错误代码如下,将print()中的v[2]那行删除即可。原因是越界了,每次push_back扩容时,VS2012编译器采用的是1.5倍的扩容方式,所以v[2]没被创建,导致崩溃。

#include <iostream>
#include <vector>
using namespace std;

void print(vector<int>);

int main()
{
	vector<int> vec;
	vec.push_back(34);//v[0]
	vec.push_back(23);//v[1]
	print(vec);
	vec.size();
}

void print(vector<int>  v)
{
	cout << "\n  vector size is:"<< v.size()  <<endl;
	cout << "\n  vector 0:"<< v[0]  <<endl;
        cout << "\n  vector 1:"<< v[1]  <<endl;
	cout << "\n  vector 2:"<< v[2]  <<endl;//因为只入了两个数据,所以这里没有显示,并且会使程序崩溃
	vector<int>::iterator p = v.begin();
}

结果会崩溃如图所示:

4.vector和list的区别

       vector和数组类似,拥有一段连续的内存空间。vector申请的是一段连续的内存,当插入新的元素内存不够时,通常以2倍重新申请更大的一块内存,将原来的元素拷贝过去,释放旧空间。因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。

        list是由双向链表实现的,因此内存空间是不连续的。只能通过指针访问数据,所以list的随机存取非常没有效率,时间复杂度为o(n); 但由于链表的特点,能高效地进行插入和删除。

        vector拥有一段连续的内存空间,能很好的支持随机存取,因此vector::iterator支持“+”,“+=”,“<”等操作符。

        list的内存空间可以是不连续,它不支持随机访问,因此list::iterator则不支持“+”、“+=”、“<”等

        vector::iterator和list::iterator都重载了“++”运算符。

        总之,如果需要高效的随机存取,而不在乎插入和删除的效率,使用vector;

        如果需要大量的插入和删除,而不关心随机存取,则应使用list。

猜你喜欢

转载自blog.csdn.net/qq_41103495/article/details/108565331
今日推荐