一、顺序容器
标准库类型vector
标准库类型vector表示对象的集合,其中所有对象的类型都相同。因为vector“容纳着”其他对象,所以它也被称作容器。
1、vector的使用
头文件: #include <vector>
vector是一个类模板:编译器根据模板创建类或函数的过程称为实例化,当使用模板时,需要指出编译器应把类或函数实例化成何种类型。
例如:
vector<int> ivec; //ivec中保存了int类型的对象
vector<Sales_item> Sales_vec; //Sales_vec中保存了Sales_item类型的对象
vector<vector<string>> file; //file中保存的是vector对象
备注:某些编译器可能仍需要以老式的声明语句来处理元素为vector的vector对象。
例如:
vector<vector<int> >
2、vector对象的定义和初始化
vector<T> v1
//v1是一个空vetor,执行默认初始化
vector<T> v2(v1)
//v2中包含v1所有元素的副本,即是使用v1对v2进行初始化
vector<T> v2=v1
//等价于v2(v1)
vector<T> v3(n,val)
//v3中包含了n个重复的元素,每个元素的值都是val
vector<T> v4(n)
//v4中包含了n个重复地执行了值初始化的对象
vector<T> v5{a,b,c……}
//v5中包含了初始值个数的元素,每个元素被赋予了相应的初始值
vector<T> v5={a,b,c……}
//等价于v5{a,b,c……}
3、向vector对象中添加元素
push_back(t)
——把一个值t当成vector对象的尾元素“压到(push)”vector对象的“尾端(back)”。
例如:
vector<int> v; //首先创建一个空的vector对象
for(int i = 0; i != 100; ++i)
v.push_back(i); //依次把整数值放到v的尾端
//此时,v中有100个元素,值分别是0~99
4、其他vector操作
v.empty()
如果v中不含有任何元素,则返回真,否则返回假
v.size()
返回v中元素的个数
v.push_back(t)
向v的尾端添加一个值为t的元素
v[n]
返回v中第n个位置上的元素的引用
v1 == v2
v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同
5、迭代器
系统自带的迭代器:
v.begin()
返回指向第一个元素的迭代器
v.end()
返回指向容器“尾元素的下一位置”的迭代器,称作尾后迭代器或者尾迭代器
备注:如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器
自定义迭代器:
vector<int>::iterator iter;
//iter能读写vector<int>的元素
vector<int>::const_iterator iter2;
//iter2只能读元素,不能写元素
迭代器运算符及运算:
*iter
返回迭代器iter所指元素的引用
iter->mem
获取iter所指元素的名为mem的成员,等价于 (*iter).mem
++iter
令iter指示容器中的下一个元素
--iter
令iter指示容器中的上一个元素
iter1 == iter2
判断两个迭代器是否相等,如果两个迭代器指示的是同一个元素或者它们是同一个容器的尾后迭代器,则相等;反之不相等。
vector<vector<int>>
常见用法:
vector<vector<int>>
类似于普通数组中的二维数组,不过每一行存放的元素个数可以不相同。
定义:
vector<vector<int>> A;
vector<vector<int> > A;
插入元素:
例如:
vector<vector<int>> A = [ [1,2,3], [4,5] ];
插入方法1:
vector<vector<int>> A;
vector<int> B;
B.push_back(1);
B.push_back(2);
B.push_back(3);
A.push_back(B);
B.clear();
B.push_back(4);
B.push_back(5);
A.push_back(B);
插入方法2:
vector<vector<int>> A;
for(int i= 0; i < 2; i++)
A.push_back(vector<int>());
A[0].push_back(1);
A[0].push_back(2);
A[0].push_back(3);
A[1].push_back(4);
A[1].push_back(5);
插入方法3:
vector<vector<int>> A;
A.push_back({1,2,3});
A.push_back({4,5,6});
A.push_back({7,8,9});
查看某元素:
采用二维数组的方式进行查看即可:
cout<<A[0][0]<<" "
<<A[0][1]<<" "
<<A[0][2]<<endl
<<A[1][0]<<" "
<<A[1][1]<<endl;
查看长度:
vector<vector<int>> A
A.size()
返回的是A中vector<int>
元素的个数。
例如:
vector<vector<int>> A = [ [1,2,3], [4,5] ];
A.size()为2。
A[i].size()
返回的是第i个vector元素的长度。
例如:
vector<vector<int>> A = [ [1,2,3], [4,5] ];
A[0].size()为3;
A[1].size()为2。
二、关联容器
与顺序容器的区别:顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的;而关联容器中的元素是按关键字来保存和访问的。
关联数组map
map中的元素是一些关键字-值(key-value):关键字起到索引的作用,值则表示与索引相关联的数据。例如,可以将一个人的名字作为关键字,将其电话号码作为值,则就是”将名字映射到电话号码“,我们可以用一个人的名字作为下标来获取此人的电话号码。与正常数组类似,不同之处在于其下标不必是整数,通过一个关键字而不是位置来查找值。
一个map中的关键字必须是唯一的,即,对于一个给定的关键字,只能有一个元素的关键字等于它。
1、map的使用
头文件: #include <map>
定义: 当定义一个map时,必须既指明关键字类型,又指明值类型。
例如:
map<string, size_t> word_count;
//空容器
map<string, string> authors = { {"Joyce", "James"},
{"Austen", "Jane"},
{"Dickens", "Charles"} };
//三个元素,authors将姓映射为名
2、向map中插入元素
首先定义一个map对象:
map<int, string> mapStudent;
方法1:利用insert函数插入pair
mapStudent.insert(pair<int, string>(000, "first"));
方法2:利用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "second");
方法3:用array方式插入
mapStudent[123] = "third";
mapStudent[456] = "forth";
区别:集合唯一性问题
当使用insert函数进行元素的插入时,如果map中已经包含该关键字,则插入失败;而当使用数组方式进行元素的插入时,如果map中已经包含该关键字,则直接覆盖该关键字之前对应的值。
补充:如何判断插入是否成功?
pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map<int, string>::value_type (001, "student_one"));
if(!Insert_Pair.second)
cout << "Error insert new element" << endl;
通过pair的第二个变量来判断是否插入成功,若插入成功,则Insert_Pair.second为true;若插入失败则为false。
3、查找map中的元素
find(key)
如果map中有与key相同的关键字时,则返回一个迭代器,设为iter,指向该数据所在的位置:
iter->first
返回该元素的key
iter->second
返回该元素的value
如果没有这样的关键字,则返回一个迭代器,其值与end()相同。
例如:
map<string, string> authors = { {"Joyce", "James"},
{"Austen", "Jane"},
{"Dickens", "Charles"} };
map<string, string>::iterator miter;
miter = authors.find("Joyce");
if(miter != authors.end())
{
cout << miter->first << " " << miter->second << endl;
}
else{
cout<< "Cannot find!" <<endl;
}
4、删除map中的元素
m.erase(k)
//从m中删除每个关键字为k的元素。
//返回一个size_type值,指出删除的元素的数量
m.erase(iter)
//从m中删除迭代器iter指定的元素。
//iter必须指向m中一个真实元素,且不能等于m.end()。
//返回一个指向iter之后元素的迭代器
m.erase(b,e)
//删除迭代器对b和e所表示范围中的元素,返回e
m.erase(m.begin(),m.end())
//清空map,等价于:
m.clear()
5、其他常用操作
m.begin()
返回指向map头部的迭代器
m.end()
返回指向map末尾的迭代器
m.empty()
如果m中不含有任何元素,则返回真,否则返回假
m.size()
返回v中元素的个数
m.count()
返回指定元素出现的次数