C++学习记录之vector容器

                                    vector容器

vector是C++标准模版库(STL,Standard Template Library)中的部分内容,vector容器强调的是提高随机访问容器内容的速度。之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 使用vector容器之前必须加上<vector>头文件:#include<vector>;  vector属于std命名域的内容,因此需要通过命名限定:using std::vector;也可以直接使用全局的命名空间方式:using namespace std;

vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,即内存空间增长是按照20,21,22,23.....增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,再将原先空间中的元素复制到新的空间中,性能消耗比较大,尤其是当元素是非内部数据时(非内部数据往往构造及拷贝构造函数相当复杂)。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越多,导致内存泄露,现在经常用的方法是swap函数来进行解决:vector<int> V;V.push_back(1); V.push_back(2);V.push_back(1); V.push_back(2);vector<int>().swap(V); 或者 V.swap(vector<int>());利用swap函数,和临时对象交换,使V对象的内存为临时对象的内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。

在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:     

1) 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector     

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

3) 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

vector成员函数

1、erase()方法:

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
(1) iterator erase(iterator _Where);删除指定位置的元素:返回值是一个迭代器,指向删除元素下一个元素.
(2) iterator erase(iterator _First,iterator _Last);删除某范围内的元素:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素.
以下实例删除vector容器中的所有'n'字符
std::vector<char> vec;
vec.clear();
vec.push_back('n');
vec.push_back('i');
vec.push_back('u');
vec.push_back('n');
vec.push_back('e');
vec.push_back('n');
for(vector<char>::iterator ite=vec.begin();ite!=vec.end();) 
{
  if('n'==*ite)
  {
    ite=vec.erase(ite);
  }
  else
  {
    ite++;
  }
}
2、push_back(elem)在尾部插入一个elem数据。
vector<int> v;
v.push_back(1);
3、pop_back()删除末尾的数据。  
vector<int> v;    
v.pop_back();
4、c.assign(beg,end)将[beg,end)一个左闭右开区间的数据赋值给c。  
vector<int> v1,v2;
v1.push_back(10);
v1.push_back(20);
v2.push_back(30);
v2.assign(v1.begin(),v1.end());
5、c.assign (n,elem)将n个elem的拷贝赋值给c。 
vector<int> v;
v.assign(5,10);//往v里放5个10
6、at(int index)传回索引为index的数据,如果index越界,抛出out_of_range异常。  
vecto<int> v;
v.at(2)//访问vector中下标是2的数据

7、c.begin()返回指向第一个数据的迭代器。  c.end()返回指向最后一个数据之后的迭代器。

8、c.rbegin()返回逆向队列的第一个数据,即c容器的最后一个数据。  c.rend()返回逆向队列的最后一个数据的下一个位置,即c容器的第一个数据再往前的一个位置。

vector<int> v; 
v.push_back(1); 
v.push_back(2); 
v.push_back(3); 
vector<int>::reverse_iterator it; 
for(it = v.rbegin();it!=v.rend();it++)
{     
  cout << *it << "\t"; 
} 

9、c.clear()移除容器中的所有数据

v
ector<int>::iterator it; 
for(it = v.begin();it!=v.end();it++)
{     
  cout << *it << "\t"; 
} 
v.clear(); 
for(it = v.begin();it!=v.end();it++)
{     
  cout << *it << "\t"; 
} 

10、empty()判断容器是否为空。

vector<int> v; 
v.push_back(1); 
v.push_back(2); 
v.push_back(3); 
if(!v.empty())
{     
  cout << "v is not empty!" << endl;        
}

11、c.front()返回第一个数据。  c.back()传回最后一个数据,不检查这个数据是否存在。

vector<int> v; 
v.push_back(1); 
v.push_back(2); 
v.push_back(3); 
if(!vec.empty())
{     
  cout << “the first number is:” << v.front() << endl;     
  cout << “the last number is:” << v.back() << endl; 
}

12、c.insert(pos,elem) 在pos位置插入一个elem的拷贝,返回插入的值的迭代器。  c.insert(pos,n,elem)在pos位置插入n个elem的数据,无返回值。  c.insert(pos,beg,end)在pos位置插入在[beg,end)区间的数据,无返回值。

vector<int> v; 
v.insert(v.begin(),10); 
v.insert(v.begin(),2,20); 
v.insert(v.begin(),v1.begin(),v1.begin()+2);

13、c.size()返回容器中实际数据的个数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值