内容综合整理自:http://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html
http://blog.youkuaiyun.com/rocispeng/article/details/7958358
向量(vector)
一、接口与实现
向量:数组的抽象与泛化,由一组元素按线性次序封装而成各元素与[0,n)内的秩一一对应
元素的类型不限于基本类型
操作、管理和维护更加简化、统一与安全
可更为便捷地参加复杂数据结构的定制与实现
操作 | 功能 | 适用对象 |
size() | 报告向量当前的规模(元素总数) | 向量 |
get(r) | 获取秩序为r的元素 | 向量 |
put(r,e) | 用e替换秩为r元素的数值 | 向量 |
insert(r,e) | e作为秩为r元素插入,原后继元素一次后移 | 向量 |
remove(r) | 删除秩为r的元素,返回该元素中原存放的对象 | 向量 |
disordered() | 判断所有元素是否已按非降序排列 | 向量 |
sort() | 调整各元素的位置,使之按非降序排列 | 向量 |
search(e) | 查找目标元素e,返回不大于e且秩最大的元素 | 有序向量 |
deduplicate() | 剔除重复元素 | 向量 |
uniquify | 剔除重复元素 | 有序向量 |
traverse | 遍历向量并做统一处理所有元素,处理方法由函数对象指定 | 向量 |
find(e) | 查找目标元素e | 向量 |
二、向量
vector是c++标准程序库中的一个类,可视为会自动扩展容量的数组,以循序(Sequential)的方式维护变量集合。vector的特色包括支持随即存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时。vector是c++标准程序库中的众多容器之一,除此之外还有list、set、map、...等等。vector以模板(泛型)方式实现,可以储存任何类型的变量,包括用户自定义的数据型态,例如:它可以是放置整数(int)型态的vector、也可以是放置字符串(string)型态的vector,活着放置用户自定类型(user-defined class)的vector。
vector定义于<vector>头文件中,与其他STL组建一样,vector属于std命名空间
vector是c++标准程序库里最基本的容器,大多数情况下都很有效率。vector设计之处即是为了改善C语言原生数组的种种缺失与不便,而提供一种更有效、更安全的数组。vector的使用接口可以模拟C语言原生数组,较明显的差异在于储存器管理,原生数组必须在声明数组的时候明确指定数组长度(例如 int a[5]),但是vector不需要指定,而是会在运行期依据状况自我调整长度,动态增大容量
vector的表现一如数据结构中的数组,允许随即存取,以索引值访问任一元素只要花费常数时间O(1),若在vector集合中间增加或删除元素时间复杂度是线性时间O(n),较为费时。虽然C++标准并没有规定实现方式,但大多数vector内部均使用动态数组方式实现。
有点点像Java里的arrylist有没有嘿嘿 “不*明*真*相的围*观群*众” 槑槑槑槑呆槑槑槑槑槑槑槑槑……
三、使用说明
声明
使用vector之前,必须先 #include<vector>
声明一个vector变量的方法如下:
std::vector<T>v;
T是vector要存储的对象集合的类型,该vector的变量名称是v。T可以是任何符合Assignable条件的类型,包或用户自定义类型。如果T不符合Assignment或者复制成本很高昂,可以考虑使用T*来代替T
取代数组使用:
#include <iostream>
#include<vector>
using namespace std;
int main()
{
std::vector<int> v;//T即是贴出相应的向量类型
v.push_back(1);//=======>v[o]==1
v.push_back(2);
v.push_back(3);
for(int i=0;i<3;i++)
{
std::cout<<v[i]<<std::endl;
}
}
vector 有四种定义方式:
1.vector<int> a(10); //定义了10个整数元素的向量,但没有给出初值,因而其值是不确定的
2.vector<int>b(10,1) //定义了10个整数元素的向量,并且给每个元素的初值赋值为1
3.vector<int>c(b) //用另一个线程的向量来创建一个向量
4.vector<int>d(b.begin(),b.begin()+3); //定义了其值依次为b向量中第0到第2个(共三个)元素的向量
长度/容量
#include <iostream>
#include<cstdlib>
#include<vector>
#include<iomanip>
#define SETW_1 10
#define SETW_2 6
#define SETW_3 10
using namespace std;
typedef vector<int> Vint;
void PrintVectorInfo(Vint& v)
{
cout<<setw(SETW_1)<<"Element"<<setw(SETW_2)<<"Size"<<setw(SETW_3)<<"Capacity"<<endl;//setw()只是起了一个对齐的作用
//capacity容量
for(Vint::iterator it=v.begin();it !=v.end();it++)//iterator是向量中的遍历器
/* 然而现在还是不太懂下面这段代码是可以替代的么
for(int i=0;i<v.size();++i) cout<<v[i]<<" ";
*/
{
cout<<setw(SETW_1)<<(*it)<<setw(SETW_2)<<v.size()<<setw(SETW_3)<<v.capacity()<<endl;
}
cout<<endl;
}
int main(int argc,char** argv)
{
//宣告一个vector
Vint vint;
//宣告两个整数变数
int a=11,b=22,c=33;
//建立只有一个元素空间的vint
//把变数a复制至第一个元素内
vint.push_back(a);
cout<<"Push Back:a="<<a<<endl;
//建立两个元素空间的vint
//把变数a复制至第一个元素内
//把变数b复制至第二个元素内
//删除上一次建立的vint
//上次建立的vint只有一个元素空间
//依此类推
vint.push_back((b));
cout<<"Push Back:b="<<b<<endl;
vint.push_back(c);
cout<<"Push Back:c="<<c<<endl;
PrintVectorInfo(vint);
//移除最后一个元素
vint.pop_back();
cout<<"Pop Back......"<<endl;
PrintVectorInfo(vint);
//清除所有元素
vint.clear();
cout<<"Clear All Elements."<<endl;
//=END=//
return 0;
}