当前位置:编程学习 > C/C++ >>

C++ STL学习之二:容器vector大总结




一、容器vector

使用vector必须包含头文件<vector>:

#include<vector>

型别vector是一个定义于namespace std内的template:


[cpp]
template<class _Ty, 
    class _Ax = allocator<_Ty> > 
template<class _Ty,
 class _Ax = allocator<_Ty> >第二个参数定义内存模型。我们一般采用默认的内存模型。

 


二、vector的功能

vector模塑出一个动态数组。vector将其元复制到内部的动态数组中。元素之间总是存在某种顺序,它是一种有序群集。支持随即存取。它的迭代器是随机存取迭代器,所以对任何一个STL算法都奏效。

向vector添加一个元素或者删除其中的一个元素,其后的所有元素都要移动位置,每一次移动都要调用赋值操作符。所以,在末端添加或删除元素,性能很好。但是在前段或者中部的话,性能较差。

vector优异性能的秘诀之一是它配置比其所容纳的元素所需更多的内存。我们需要了解大小和容量的关系。

函数size()可以返回vector的大小,即vector中实际元素的个数。

而capacity()返回容量,是当前的vector所实际能够容纳的元素的数量。它应该总是大于或者等于vector的大小。如果需要向vector中放置比capacity更多的元素,则需要重新配置内部存储器。vector的容量也会随之增长。看下面的示例代码:


[cpp]
#include <iostream>  
#include <vector>  
#include <string>  
#include <algorithm>  
using namespace std; 
 
int main() 

    vector<string> sentence(1); 
    cout << "max_size():" << sentence.max_size() << endl; 
    cout << "size():" << sentence.size() << endl; 
    cout << "capacity():" << sentence.capacity() << endl; 
 
    sentence.reserve(5); 
 
    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; 
 
    cout << "max_size():" << sentence.max_size() << endl; 
    cout << "size():" << sentence.size() << endl; 
    cout << "capacity():" << sentence.capacity() << endl; 
 
    swap(sentence[1],sentence[3]); 
 
    sentence.insert(find(sentence.begin(),sentence.end(),"?"), 
        "always"); 
 
    sentence.back() = "!"; 
 
    copy(sentence.begin(),sentence.end(), 
        ostream_iterator<string>(cout," ")); 
 
    cout << endl; 
 
    cout << "max_size():" << sentence.max_size() << endl; 
    cout << "size():" << sentence.size() << endl; 
    cout << "capacity():" << sentence.capacity() << endl; 

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

int main()
{
 vector<string> sentence(1);
 cout << "max_size():" << sentence.max_size() << endl;
 cout << "size():" << sentence.size() << endl;
 cout << "capacity():" << sentence.capacity() << endl;

 sentence.reserve(5);

 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;

 cout << "max_size():" << sentence.max_size() << endl;
 cout << "size():" << sentence.size() << endl;
 cout << "capacity():" << sentence.capacity() << endl;

 swap(sentence[1],sentence[3]);

 sentence.insert(find(sentence.begin(),sentence.end(),"?"),
  "always");

 sentence.back() = "!";

 copy(sentence.begin(),sentence.end(),
  ostream_iterator<string>(cout," "));

 cout << endl;

 cout << "max_size():" << sentence.max_size() << endl;
 cout << "size():" << sentence.size() << endl;
 cout << "capacity():" << sentence.capacity() << endl;
}运行结果:
\

 

在程序中,当再次向vector插入元素时,由于vector的容量不够,所以引起了内存的重新分配。但是capacity()的结果与实作版本有关,max_size也是。

 


vector的容量十分重要,是因为:

1、一旦内存重新配置,与之相关的所有的reference、pointers、iterators都会失效。

2、内存配置很费时。

解决这个问题的方法有:

1、可以使用reserve()保留适当容量,减少重新配置内存的次数。示例代码:


[cpp]
vector<string> sentence(1); 
sentence.reserve(50); 
vector<string> sentence(1);
sentence.reserve(50);2、在初始化期间向构造函数传递附加参数,构造出足够的空间。
[cpp]
vector<T> v(5); 
vector<T> v(5);当然,这种元素的型别必须提供默认构造函数。但是如果元素的型别比较复杂,初始化操作也很耗时。如果只是为了保留足够的内存,使用方法1较好。

注意:reserve不能缩减vector的容量。由此,我们可以知道,即使删除元素,其reference、pointers、iterators也会继续有效,指向动作发生前的位置。

但是插入操作可能使reference、pointers、iterators失效(因为可能会导致重新配置空间)。

 


使用swap函数可以缩减vector容量。因为两个vector交换内容后,他们的容量也会互换。

1、


[cpp]
template<class T> 
void shrinkCapacity(vector<T> &v) 

    vector<T> tmp(v); 
    v.swap(tmp); 

template<class T>
void shrinkCapacity(vector<T> &v)
{
 vector<T> tmp(v);
 v.swap(tmp);
}2、
[cpp]
vector<T>(v).swap(v); 
vector<T>(v).swap(v);上面两种方法等价。 www.zzzyk.com
都是先构造出一个临时vector对象,以v的元素进行初始化,再与v进行交换。需要注意的是:临时对象一般都是精确分配实际所需的内存。所以能够起到减小vector容量的效果。

 


三、vector的操作函数

所有的构造函数和析构函数如下:

 \


 

非变动性操作:

 \

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,