C++STL中的容器类型分为两种,一种是顺序容器,另一种是关联容器,这两种容器之所以被划分,本质区别是顺序容器可以通过元素在容器中的位置进行访问及存储,而关联容器只能通过键来访问和存储元素
顺序容器常用的主要有以下几个:vector(可变数组),string(字符数组),list(双向链表),deque(双端队列),这几个容器都定义在各自的头文件中,头文件名与容器名相同
1.vector(可变数组)
最最常用的容器,可随机访问,插入和删除元素较list慢
vector概述见C++知识点4——vector与string简述
1.1 vector的赋值
vector的赋值除了使用列表赋值
和别的vector对象赋值,还可以使用assign操作,assign的操作方式有以下三种
template <class InputIterator>
void assign (InputIterator first, InputIterator last);
这种操作接受的是两个输入迭代器,将迭代器范围内的元素赋值给容器
void assign (size_type n, const value_type& val);
这种操作接受的是n个val,将n个val赋值给容器
void assign (initializer_list<value_type> il);
这种操作接受的是一个初始化列表,将列表中的元素赋值给容器
具体使用如下:
int main(int argc, char const *argv[])
{
vector<int> v1(10,3);
v1.assign(10,6);
for (auto i:v1) {
cout<<i<<endl;
}
cout<<"------------------------"<<endl;
v1.assign({1,2,3,4,5});
for (auto i:v1) {
cout<<i<<endl;
}
cout<<"------------------------"<<endl;
vector<int> v2(10,4);
v1.assign(v2.begin()+3,v2.end());
for (auto i:v1) {
cout<<i<<endl;
}
return 0;
}

上述三种赋值操作将vector内的元素值擦除并替换
1.2 交换两个vector
交换两个vector可以使用swap函数
void swapope()
{
vector<int> v1={1,2,3};
vector<int> v2={4,5,6};
for (int i=0;i<v1.size();++i) {
cout<<v1[i]<<','<<&v1[i]<<endl;
}
cout<<"------------------------"<<endl;
for (int i=0;i<v2.size();++i) {
cout<<v2[i]<<','<<&v2[i]<<endl;
}
swap(v1,v2);
cout<<"after swap"<<endl;
for (int i=0;i<v1.size();++i) {
cout<<v1[i]<<','<<&v1[i]<<endl;
}
cout<<"------------------------"<<endl;
for (int i=0;i<v2.size();++i) {
cout<<v2[i]<<','<<&v2[i]<<endl;
}
}

可见,交换前后,两个容器仅仅只是换个名字,容器里的元素没被移动,所以,swap之后,容器的迭代器仍然有效,仍然指向swap之前的那些元素
因为swap仅仅是交换名字,所以对于常用的顺序容器来说,swap不进行任何的拷贝,删除,添加操作,处理时间为常数
1.3 添加元素
vector常用的添加元素的方法处理push_back(尾部添加)外,还有insert方法,insert方法的重载有以下四种:
1.在迭代器position指向元素之前插入一个值为val的元素,返回指向val的迭代器
iterator insert (const_iterator position, const value_type& val);
示例:
void insertope()
{
vector<int> v1={1,2,3};
vector<int>::iterator it=v1.insert(v1.begin()+1,66);
for (auto i:v1) {
cout<<i<<endl;
}
cout<<*it<<endl;
}

v1.begin()+1指向第二个元素,所以在第二个元素的前面位置上插入66,返回的迭代器也指向66
2.在迭代器position指向元素之前插入n个值为val的元素,返回指向第一个val的迭代器
iterator insert (const_iterator position, size_type n, const value_type& val);
示例
void insertope()
{
vector<int> v1={1,2,3};
vector<int>::iterator it=v1.insert(v1.begin()+1,5,66);
for (auto i:v1) {
cout<<i<<endl;
}
cout<<*it<<','<<*(--it)<<endl;
}

3.在迭代器position指向元素之前插入迭代器first和last范围内的元素,返回指向新添加第一个元素的迭代器
template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);
示例
void insertope()
{
vector<int> v1={1,2,3};
vector<int> v2={4,5,6};
vector<int>::iterator it=v1.insert(v1.begin()+1,v2.begin()+1,v2.end());
for (auto i:v1) {
cout<<i<<endl;
}
cout<<*it<<','<<*(--it)<<endl;
}

4.在迭代器position指向元素之前插入列表范围内的元素,返回指向新添加第一个元素的迭代器
iterator insert (const_iterator position, initializer_list<value_type> il);
示例
void insertope()
{
vector<int> v1={1,2,3};
vector<int> v2={4,5,6};
vector<int>::iterator it=v1.insert(v1.begin()+1,{11,22,33});
for (auto i:v1) {
cout<<i<<endl;
}
cout<<*it<<','<<*(--it)<<endl;
}

1.4 访问元素
除了使用迭代器和下标进行元素访问,还有三个方法可以访问vector中的元素
1 at方法,返回下标为n的引用
reference at (size_type n);
const_reference at (size_type n) const;
void atfunc()
{
vector<int> v(10);
for (int i=0;i<v.size();++i) {
v.at(i)=i;//调用reference at (size_type n);
}
for (int i=0;i<v.size();++i) {
cout<<v.at(i)<<endl;//调用const_reference at (size_type n) const;
}
}

2 back方法,返回尾元素的引用
reference back();
const_reference back() const;
3.front方法,返回头元素的引用
reference front();
const_reference front() const;
示例
void backandfrontfunc()
{
vector<int> v1={1,2,3};
v1.front()-=v1.back();//1-3
cout<<v1.front()<<endl;//返回引用,所以v1.front()变为-2
v1.back()-=v1.front();//3-(-2)
cout<<v1.back()<<endl;
for (auto i:v1) {
cout<<i<<endl;
}
}

上述这些方法访问是要确保vector对象中不为空,且索引n不能越界
1.4 删除元素
除了pop_back用来删除尾元素之外(使用pop_back前,一定要判断vector对象不为空),还有clear方法用来删除vector中的所有元素,还有重载方法erase删除vector中的指定元素
1 clear函数,清楚所有的vector中的元素
void clear();
2.erase函数,删除迭代器指向的元素,返回被删除元素之后元素的迭代器
iterator erase (iterator position);
void erasefunc()
{
vector<int> v1={1,2,3};
vector<int>::iterator it=v1.erase(v1.begin()+1);
for (auto i:v1) {
cout<<i<<endl;
}
cout<<*it<<endl;
}

it指向3
3.erase函数,删除迭代器范围内的元素,返回最后一个被删除元素之后元素的迭代器
iterator erase (iterator first, iterator last);
void erasefunc()
{
vector<int> v1={1,2,3,4,5,6};
vector<int>::iterator it=v1.erase(v1.begin()+2, v1.begin()+4);
for (auto i:v1) {
cout<<i<<endl;
}
cout<<*it<<endl;
}

删除了3和4,最后it指向5
参考
http://www.cplusplus.com/reference/vector/vector/
《C++ Primer》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
本文深入探讨C++标准模板库中的vector容器,讲解其赋值、交换、元素添加与访问、删除等操作,并提供示例代码,帮助读者掌握vector的高效使用技巧。
2万+

被折叠的 条评论
为什么被折叠?



