顺序容器不是说容器中的数据按照顺序排列,而是说元素的顺序和元素加入容器的值相对应。
容器的迭代器,vector的迭代器 vector<int> ::iterator begin; begin就是这个vector的迭代器。
一个迭代器范围是由一对迭代器表示的,begin指向范围中的第一个元素,end指向范围中的最后一个元素之后的位置,所以这种元素范围是一个左闭右开区间。[begin,end)
begin==end说明范围为空
通过若干次迭代可以让begin和end相等。
用一个容器拷贝另一个容器时,如果是容器之间的拷贝,容器的类型和元素类型必须相同。如果用迭代器范围进行拷贝,不要求容器类型相同。
array和内置数组不一样,array的长度不能改变,array的初始化方式和内置数组也不一样,array初始化:array<int,10> ::size_type i;
内置数组不能赋值和拷贝,但是array可以。
swap函数用来交换两个相同类型容器的内容。
容器的类型不同,容器中元素的类型也不同,但是容器中元素的类型相容(可以相互转化)的时候,采用assign;
下面举例说明三种不同的赋值方式:
容器间赋值
vector<int> vec1;
vector<int > vec2 = vec1;
范围赋值
list<int> vec3(vec1.begin(),vec1.end());
assign赋值
list<double> vec4;
vec4.assign(vec1.begin().vec1.end());
比较容器的大小和比较string的大小是一样的,比较容器大小的时候是看一个容器是不是另一个容器的子序列,如果不是那么就看第一个不相同的元素谁的比较大,那个就是大的容器。
向容器中添加元素:
push_back();所有容器都可以使用这个方法,把元素追加到容器的尾部。
push_front();把元素追加到容器的头部,vector是不支持这个函数的。
insert();在容器的特定位置插入元素,insert(一个迭代器,要插入的元素);insert方法的第一个参数指定了元素插入的位置,将元素插入到这个位置之前。
vector不应该用插入方法,除了向尾部插入元素以外向其他任何地方插入速度都很慢。
用insert方法向vector插入元素的时候,会使原来指向容器的迭代器,引用和指针失效。
访问容器中的元素:
每个顺序容器都有一个front成员函数和一个back成员函数。
front函数返回的是首元素的引用,back获得的是末尾元素的引用。
vector <int> vec;
auto vec.front(); 和 auto *vec.begin(); 对vec的begin迭代器解引用得到的也是首元素的引用。
auto vec.back(); 和 auto *(--vec.end()) 对vec的end迭代器向前移动再解引用得到末尾元素的引用。
成员函数的返回值是引用类型。
auto &v1 = vec.back();
v1 = 4000;改变了vec中最后一个元素的值。
auto v2 = vec.back();
v2 = 3000;并没有改变vec中元素的值
删除元素
pop_back() 函数,删除末尾元素
c.erease(p) 删除迭代器p所指的元素,函数的实参是迭代器,返回值也是迭代器
c.erease(b,e) 删除迭代器b和e指定范围内的元素
erease返回的是指向删除元素之后位置的迭代器
string的其它特殊用法
s.substr(pos,n) 函数,返回string的一个子字符串或者他本身。从pos开始的n个字符
append() 函数在string末位进行插入操作
replace() 函数删除string中的一部分用其它字符替换
string的搜索操作:
string的搜索函数的返回值应该是auto类型的。
find()函数,如果找到久返回第一个匹配位置的下标(下标是从0开始的)。
compare()函数,比较两个字符串。
to_string(val)函数把val转化成字符串
sto…也可以把string转化成其它类型