zoukankan      html  css  js  c++  java
  • 关于vector大小(size)和容量(capacity)总结

    操作大小的函数

            在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插入元素,可能导致迭代器失效的原理。

  • 相关阅读:
    RPC和Socket
    监控与管理dubbo服务
    系统架构
    Spring Web工程web.xml零配置即使用Java Config + Annotation
    Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
    Zxing 的集成 ---- Maven 对应 Gradle 的写法
    Android SpannableString与SpannableStringBuilder
    Android 仿微信朋友圈9宫格图片展示&多选图片
    AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)
    Android 清除canvas 笔迹代码
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468420.html
Copyright © 2011-2022 走看看