关于vector大小(size)和容量(capacity)总结
2016-04-08 22:37
513 查看
操作大小的函数
在Vector容器中有以下几个关于大小的函数方法 | 效果 |
size() | 返回容器的大小 |
empty() | 判断容器是否为空 |
max_size() | 返回容器最大的可以存储的元素 |
capacity() | 返回容器当前能够容纳的元素数量 |
例子一:
该例子主要展示了关于大小操作函数的使用与区别int _tmain(int argc, _TCHAR* argv[]) { vector<string> sentence; sentence.reserve(5); //append some elements sentence.push_back("hello"); sentence.push_back("how"); sentence.push_back("are"); sentence.push_back("you"); sentence.push_back("?"); copy(sentence.begin(), sentence.end(), ostream_iterator<string>(cout, " ")); cout << endl; //print "technical data" cout << "max_size():" << sentence.max_size() << endl; cout << "size():" << sentence.size() << endl; cout << "capacity():" << sentence.capacity() << endl; cout << "**************************" << endl; //swap second and fourth element swap(sentence[1], sentence[3]); //insert element "always" before element "?" sentence.insert(find(sentence.begin(), sentence.end(), "?"), "always"); //assign "!" to the last element sentence.back() = "!"; copy(sentence.begin(), sentence.end(), ostream_iterator<string>(cout, " ")); cout << endl; //print "technical data" // return maximum possible length of sequence //回容器的最大可以存储的元素个数,这是个极限,当容器扩展到这个最大值时就不能再自动增大 cout << "max_size():" << sentence.max_size() << endl; // return length of sequence cout << "size():" << sentence.size() << endl; // return current length of allocated storage cout << "capacity():" << sentence.capacity() << endl; return 0; }Vector的容量之所以重要,有以下两个原因:
1. 容器的大小一旦超过capacity的大小,vector会重新配置内部的存储器,导致和vector元素相关的所有reference、pointers、iterator都会失效。
2.内存的重新配置会很耗时间。
例子二:
该例子主要介绍了容器的重新配置导致iterator失效问题。
int _tmain(int argc, _TCHAR* argv[]) { vector<string> strVector; strVector.reserve(5);//当前空间够大,不会发生重新配置,插入新元素后有可能会重新分配 strVector.push_back("hello"); strVector.push_back("C++"); strVector.push_back("world"); vector<string>::iterator it = strVector.begin(); cout << "chang size befor, the first elemt:" << *it << endl; cout << "push_back one elems:." << endl; strVector.push_back("MS"); cout << "push_back one elemt after, the first elemt:" << *it << endl; cout << "push_back two elems:" << endl; strVector.push_back("HW"); strVector.push_back("BAT");//当前大小超过当前的容量,导致重新分配内存 //it = strVector.begin(); 内存重新分配后,重新获取指针可以避免指针失效 cout << "push_back two elemts after, the first elemt:"<< *it << endl;//指针失效导致程序奔溃, return 0; }
避免内存重新配置的方法
方法一:Reserve()保留适当容量
在创建容器后,第一时间为容器分配足够大的空间,避免重新分配内存。std::vector<int> v;//create an empty vector v.reverse(80);// reserve memory for 80 elements
方法二:利用构造函数创建出足够空间
该方法是创建容器时,利用构造函数初始化的出足够的空间,std::vector<int> v(80);
Vector内存扩展方式
vector内存成长方式可归结以下三步曲:(1)另觅更大空间;
(2)将原数据复制过去;
(3)释放原空间三部曲。
如果不是vector每次配置新空间时都有留下一些余裕,其成长假象所带来的代价将是相当高昂,从内存的扩展方式就可以看出向vector插入元素,可能导致迭代器失效的原理。
相关文章推荐
- vbs Size 属性使用介绍(获取文件大小)
- C++ Vector用法详解
- 大家注意vector, list, set, map成员函数erase
- java中vector与hashtable操作实例分享
- C++ vector删除符合条件的元素示例分享
- PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
- C++ Vector用法深入剖析
- vector与map的erase()函数详细解析
- 解决File size limit exceeded 错误的方法
- vector,map,list,queue的区别详细解析
- C++ vector的用法小结
- stl容器set,map,vector之erase用法与返回值详细解析
- C++中vector的用法实例解析
- c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
- 关于STL中vector容器的一些总结
- 简述Matlab中size()函数的用法
- JAVA Vector源码解析和示例代码
- Java中的Vector和ArrayList区别及比较
- 浅谈 java中ArrayList、Vector、LinkedList的区别联系
- 用SQL命令查看 MySQL l数据库大小