C++STL -- vector 使用
vector是一种顺序容器。
vector常用API:

现在一个个分析:
1. assign
这是一种赋值方法,但是会覆盖原来容器内的值。
void assign( size_type num, const TYPE& val ); //num个val的值 void assign( input_iterator start, input_iterator end );
例子:
//第一种:赋值为num个val值
vector<,); //这里初始化为3个5
v.assign(,); //会覆盖上面的初始值
for(auto i : v)
cout << i << endl; //输出4个0
//第二种:利用迭代器
vector<int> v2(v.begin(), v.end());
for(auto i : v)
cout << i << endl; //输出4个0
2. at
返回对应坐标的值,作用同利用下标访问。(比下标访问多一个好处:会进行范围检查,越界会抛出out_of_range异常。
vector<, );
cout << v[] << endl;
cout << v.at() << endl; //terminate called after throwing an instance of 'std::out_of_range'
3. back
返回最后一个元素的值。(不进行范围检查)
vector<int> v;
v.push_back();
v.push_back();
cout << v.back() << endl; //输出2
4. begin
返回指向第一个元素的迭代器。
5. capacity
返回vector容器的容量,注意和大小是不同的,容量总是大于等于大小。vector总是定义一个较大的值作为容量,这样就不用每次增加元素时都换到较大的空间(这需要花费时间)。当元素增加到超过capacity时,capacity会自动加倍。
vector<int> v;
v.push_back();
v.push_back();
v.push_back(); //一共3个元素
cout << v.capacity() << endl; //输出4
6. clear
清空所有元素,变为空(不是默认值),但是capacity还是不变的。
vector<,); v.clear();
7. empty
判断vector是否为空。
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.clear();
cout << v.empty() << endl; //输出1
8. end
返回指向最后一个元素后面一位的迭代器。
9. erase
删除迭代器指定的元素。
iterator erase( iterator loc ); iterator erase( iterator start, iterator end );
例子:
//第一种:删除迭代器指定的元素
vector<int> v;
v.push_back();
v.push_back();
v.erase(v.begin());
cout << v[] << endl; //输出2
//第二种:删除迭代器指定的范围
v.push_back();
v.push_back();
v.push_back();
v.erase(v.begin(), v.begin()+);
for(auto i : v)
cout << i << endl; //输出3
PS.耗时O(n)
注意:erase会使后面的迭代器失效,且erase返回的是下一个有效的迭代器。如果要删除值为偶数的项,应该如下:
for(auto i=v.begin(); i != v.end(); i++) {
== ) {
v.erase(i);
i--;
}
}
10. front
返回指向第一个元素的引用。(不进行范围检查)
11. insert
在指定的位置之前插入元素。
方法:
iterator insert( iterator loc, const TYPE& val ); void insert( iterator loc, size_type num, const TYPE& val ); template<TYPE> void insert( iterator loc, input_iterator start, input_iterator end );
例子:
vector<,);
vector<,);
v.insert(v.begin(), ); //在begin之前插入11,即11变成第一个元素
v.insert(v.begin(), , ); //在begin之前插入2个22
v.insert(v.begin(), temp.begin(), temp.end()); //在begin之前插入temp从begin到end的所有元素
for(auto e : v)
cout << e << endl;
12. max_size
返回vector能容纳的元素数量的上限。注意,size是当前的元素数量,capacity是稍大于size的容量,而max_size是能容纳的最大数量。
在我的64位机子上,该值是4611686018427387903,即8字节。
13. pop_back
移除最后一个元素。
14. push_back
添加元素到最后。
vector<int> v;
; i<; i++)
v.push_back(i);
for(auto e : v)
cout << e << endl;
15. rbegin
返回reverse_iterator(逆迭代器),指向最后一个元素,而且方向是向begin移动(一般迭代器加正值是向vector尾移动)。
16. rend
返回指向第一个元素前面的reverse_iterator。
vector<int> v;
; i<; i++)
v.push_back(i);
auto i = v.rbegin();
while(i != v.rend())
cout << *i++ << endl; //逆序输出vector
17. reserve
设置capacity的大小,如果小于原来的capacity则无效。
vector<,);
v.reserve();
cout << "capacity: " << v.capacity() << endl; //输出15
v.reserve();
cout << "capacity: " << v.capacity() << endl; //输出15
for(auto e : v)
cout << e << " ";
18. resize
方法:
void resize( size_type num, const TYPE& val = TYPE() );
例子:
//第一种
vector<,);
v.resize();
cout << v.size() << endl; //输出15
for(auto e : v)
cout << e << " "; //多出来的5个元素填充为默认值0
cout << endl;
v.resize();
cout << v.size() << endl; //输出5
for(auto e : v)
cout << e << " "; //多余元素被移除
//第二种
v.resize(, ); //指定多出的元素赋值为8
cout << v.size() << endl; //输出15
for(auto e : v)
cout << e << " "; //多出来的元素填充为指定值8
19. size
返回当前含有的元素数量。
20. swap
交换指定容器的内容。
方法:
void swap( container& from );
例子:
vector<,);
vector<,);
v1.swap(v2);
for(auto e : v1)
cout << e << endl;
for(auto e : v2)
cout << e << endl;
21. 构造函数
vector(); vector( const vector& c ); vector( size_type num, const TYPE& val = TYPE() ); vector( input_iterator start, input_iterator end );
例子:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//第一种:无参数
vector<int> v;
v.push_back(10);
v.push_back(1);
for(auto i : v)
cout << i << endl;
//第二种:用已有的vector来初始化
vector<int> v2(v); //将一个容器复制给另外一个容器,容器类型和元素类型都必须相同
for(auto i : v2)
cout << i << endl;
//第三种:指定容器内元素的个数,每个元素用默认值
vector<int> v3(4); //int的默认值是0
for(auto i : v3)
cout << i << endl;
//第四种:指定容器内元素的个数,指定每个元素的值
vector<int> v4(4,1); //4个1
for(auto i : v4)
cout << i << endl;
//第五种:将迭代器指定范围内的元素赋值给容器
auto beginIt = v.begin();
auto endIt = v.end();
vector<int> v5(beginIt, endIt);
for(auto i : v5)
cout << i << endl;
return 0;
}
注意: (1) 将一个容器复制给另外一个容器,容器类型和元素类型都必须相同。
(2) 指针也是迭代器。
(3) 其他容器的迭代器也能用来初始化vector
其他:
(1)vector的元素类型必须具备assignable(可赋值的)和copyable(可复制的)两个性质.
(2)在末端增加或删除元素只需O(1) , 但在前端或中部插入或删除元素需O(n).
(3)尽量使用reserve()来保证容量够你用 , 避免内存重新分配.
(4)reserve()比vector(n)好,因为某些复杂的元素类型可能初始化很耗时,而reserve()则是直接指定容量大小,不涉及元素赋值问题。
(5)增加元素的操作,比如push_back, insert等,可能会导致内存重新分配,使得原来的指针,迭代器等都失效。
技巧:
1. 缩减容量
template <typename T>
void ShrinkCapacity(vector<T>& v) {
vector<T> temp(v);
v.swap(temp);
}
这里,temp复制v,只是创建一个刚好能容纳v所有元素的内存空间,因此多余的容量去掉了。
2. 删除与某值相等的所有元素
template <typename T>
void RemoveAllValue(vector<T>& v, const T& value) {
v.erase(remove(v.begin(), v.end(), value), v.end());
}
remove是<algorithm>中的函数,可以删除一个区间中所有的等于value的值,把后面的元素移上来,返回结束处的迭代器。但是这个方法只是移动元素,并没有真正删除。因此之后利用erase删除多余的元素.
3. 删除与某值相等的第一个元素
template <typename T>
void RemoveValue(vector<T>& v, const T& value) {
auto pos = find(v.begin(), v.end(), value);
if(pos != v.end()) {
v.erase(pos);
}
}
C++STL -- vector 使用的更多相关文章
- C++ STL vector容器学习
STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...
- STL vector
STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- STL vector+sort排序和multiset/multimap排序比较
由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在 ...
- STL vector 用法介绍
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- STL vector使用方法介绍
介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- stl——vector详解
stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...
- C++STL vector详解(杂谈)
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- C++ stl vector介绍
转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if ...
- 浅谈C++ STL vector 容器
浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...
随机推荐
- Spring事务解析4-切面织入
BeanFactoryTransactionAttributeSourceAdvisor作为Advisor的实现类,自然要遵从Advisor的处理方式,当代理被调用时会调用这个类的增强方法,也就是此b ...
- shell-bash学习01基础、打印、环境变量
基础 终端提示符: username@hostname$; $: 一般用户 #:root用户 运行脚本 Bash执行: * bash script.sh; 直接运行: 脚本开头添加shebang起始: ...
- express-7 请求和响应对象(2)
获取更多信息 如果正在寻找某些功能,首先要查看Express的API文档 如果需要的信息没在文档中,有时就不得不深入研究Express源码; 下面是Express源码的路径说明 lib/applica ...
- js小例子(标签页)
运用js写的一个小例子,实现点击不同的标签出现不同的内容: <!DOCTYPE html> <html> <head> <meta chaset=" ...
- 【面试题】TB
动态库与静态库区别: 堆栈区别,这样区分的意义: 不用第三个变量,交换两个变量的值: 链表公共节点: 判断链表是否有环: 常用排序算法,哪个可以链表实现: 哪科学的好,感兴趣: 项目介绍,遇到的最大问 ...
- vector初始化
对vector对象来说,直接初始化的方式适用于3种情况:1.初始值已知且数量少:2.初始值是另一个vector对象的副本:3.所有元素的初始值都一样.此外还有一种更常见的情况是4.创建一个vector ...
- POJ3680 Intervals(最小费用最大流)
选择若干条线段使权值最大,并且点覆盖次数不超过k. 建图如下:vs到0建立容量为k费用为0的边:坐标终点到vt连接一条容量为k费用为0的边:对于每两个相邻坐标连接一条容量为INF费用为0的边:对于线段 ...
- iOS之03-类的合理设计
以下代码为了充分学习理解 类与对象 类与对象的定义 类就是将事物的共有属性和方法抽离出来形成的:类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起. 对象是具有类类 ...
- BZOJ1894 : Srm444 avoidfour
首先只有质数个$4$且个数不超过$10$的限制条件才有用, 也就是长度不能为$44,444,44444,4444444$的倍数. 考虑容斥,计算长度必须是它们$lcm$的倍数,且没有连续$4$个$4$ ...
- svn服务器端的客户端自动更新
先说这个方式的一个弊端,那就是服务器端这边代码不能与svn服务器出现冲突,一旦冲突就失效. 实现原理是,利用svn版本库,hooks目录的bat钩子开展工作. 共在hooks目录下建立3个文件如下:p ...