容器
vector容器
vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:
#include <vector>
using namespace std;
vector容器的创建
(1)
vector<int> v;
注意,这是一个空的 vector 容器,因为容器中没有元素,所以没有为其分配空间。当添加第一个元素(比如使用 push_back() 函数)时,vector 会自动分配内存。
在创建好空容器的基础上,还可以像下面这样通过调用 reserve() 成员函数来增加容器的容量:
v.reserve(20);
这样就设置了容器的内存分配,即至少可以容纳 20 个元素。注意,如果 vector 的容量在执行此语句之前,已经大于或等于 20 个元素,那么这条语句什么也不做;另外,调用 reserve() 不会影响已存储的元素,也不会生成任何元素,即 values 容器内此时仍然没有任何元素。
(2) 除了创建空 vector 容器外,还可以在创建的同时指定初始值以及元素个数,比如:
vector<int> p {2, 3, 5, 7, 11, 13, 17, 19};
(3)在创建 vector 容器时,也可以指定元素个数:
vector<double> v(20);
注意,圆括号 () 和大括号 {} 是有区别的,前者(例如 (20) )表示元素的个数,而后者(例如 {20} ) 则表示 vector 容器中只有一个元素 20。
如果不想用 0 作为默认值,也可以指定一个其它值,例如:
vector<double> v(20, 1.0);
第二个参数指定了所有元素的初始值,因此这 20 个元素的值都是 1.0。
圆括号中的参数既可以用常量来表示,也可以用变量来表示。
(4)通过存储元素类型相同的其它 vector 容器,也可以创建新的 vector 容器,例如:
vector<char> v1(5, 'c');
vector<char> v2(v1);
vector 函数的用法
函数成员 | 函数功能 |
---|---|
begin() | 返回指向容器中第一个元素的迭代器。 |
end() | 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。 |
rbegin() | 返回指向最后一个元素的迭代器。 |
rend() | 返回指向第一个元素所在位置前一个位置的迭代器。 |
size() | 返回实际元素个数。 |
empty() | 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。 |
front() | 返回第一个元素的引用。 |
back() | 返回最后一个元素的引用。 |
push_back() | 在序列的尾部添加一个元素。 |
pop_back() | 移出序列尾部的元素。 |
insert() | 在指定的位置插入一个或多个元素。 |
erase() | 移出一个元素或一段元素。 |
clear() | 移出所有的元素,容器大小变为 0。 |
swap() | 交换两个容器的所有元素。 |
关于函数begin(),end()的用法
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int main()
{
vector<int> v{1, 2, 3, 4, 5};
for(auto i = v.begin(); i != v.end(); i ++)
{
cout << *i << ' ';
}
cout << endl;
}
//输出 1 2 3 4 5
关于函数rbegin(),rend()的用法
for (auto first = values.rbegin(); first != values.rend(); ++first) {
cout << *first << " ";
}
//输出 5 4 3 2 1
vector容器中元素的访问方法
vector容器可以像数组那样访问。并且下标从0开始。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values{1,2,3,4,5};
//获取容器中首个元素
cout << values[0] << endl;
//修改容器中下标为 0 的元素的值
values[0] = values[1] + values[2] + values[3] + values[4];
cout << values[0] << endl;
return 0;
}
//输出 1 14
vector容器中front(),back()用法
可以访问也可以修改首尾的值。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values{1,2,3,4,5};
cout << "values 首元素为:" << values.front() << endl;
cout << "values 尾元素为:" << values.back() << endl;
//修改首元素
values.front() = 10;
cout <<"values 新的首元素为:" << values.front() << endl;
//修改尾元素
values.back() = 20;
cout << "values 新的尾元素为:" << values.back() << endl;
return 0;
}
//输出:
/*
values 首元素为:1
values 尾元素为:5
values 新的首元素为:10
values 新的尾元素为:20
*/
访问多个元素的方法
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values{1,2,3,4,5};
//从下标 0 一直遍历到 size()-1 处
for (int i = 0; i < values.size(); i++) {
cout << values[i] << " ";
}
return 0;
}
//输出结果:1 2 3 4 5
push_back()
该成员函数的作用是在容器尾部添加一个函数。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values{};
values.push_back(1);//在尾部插入一个1,由于之前没有元素,所以1放在容器的首位
values.push_back(2);
for (int i = 0; i < values.size(); i++) {
cout << values[i] << " ";
}
return 0;
}
//输出 1 2
insert()
四个方法:
函数 | 用法 |
---|---|
iterator insert(pos,elem) | 在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。 |
iterator insert(pos,n,elem) | 在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。 |
iterator insert(pos,first,last) | 在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。 |
iterator insert(pos,initlist) | 在迭代器 pos 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。 |
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include<array>
using namespace std;
const int N = 1e5 + 10;
int main()
{
vector<int> v{1, 2};
v.insert(v.begin() + 1, 3); //{1, 3, 2}
v.insert(v.end(), 2, 5);//{1, 3, 2, 5, 5}
array<int, 3> test{7, 8, 9};
v.insert(v.end(), test.begin(), test.end());//{1, 3, 2, 5, 5, 7, 8, 9}
v.insert(v.end(), {10, 11});//{1, 3, 2, 5, 5, 7, 8, 9, 10, 11}
for(auto i = v.begin(); i != v.end(); i ++)
cout << *i << ' ';
//输出:1, 3, 2, 5, 5, 7, 8, 9, 10, 11
}
vector容器的元素删除方法
函数 | 功能 |
---|---|
pop_back() | 删除 vector 容器中最后一个元素,该容器的大小(size)会减 1,但容量(capacity)不会发生改变。 |
erase(pos) | 删除 vector 容器中 pos 迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器。该容器的大小(size)会减 1,但容量(capacity)不会发生改变。 |
swap(beg)、pop_back() | 先调用 swap() 函数交换要删除的目标元素和容器最后一个元素的位置,然后使用 pop_back() 删除该目标元素。 |
erase(beg,end) | 删除 vector 容器中位于迭代器 [beg,end)指定区域内的所有元素,并返回指向被删除区域下一个位置元素的迭代器。该容器的大小(size)会减小,但容量(capacity)不会发生改变。 |
remove() | 删除容器中所有和指定元素值相等的元素,并返回指向最后一个元素下一个位置的迭代器。值得一提的是,调用该函数不会改变容器的大小和容量。 |
clear() | 删除 vector 容器中所有的元素,使其变成空的 vector 容器。该函数会改变 vector 的大小(变为 0),但不是改变其容量。 |
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int>demo{ 1,2,3,4,5 };
demo.pop_back();
//输出 dmeo 容器新的size
cout << "size is :" << demo.size() << endl;
//输出 demo 容器新的容量
cout << "capacity is :" << demo.capacity() << endl;
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
return 0;
}
pop_back()用法简单,无返回值。
运行结果:
size is :4
capacity is :5
1 2 3 4
erase()
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int>demo{ 1,2,3,4,5 };
auto iter = demo.erase(demo.begin() + 1);//删除元素 2
//输出 dmeo 容器新的size
cout << "size is :" << demo.size() << endl;
//输出 demo 容器新的容量
cout << "capacity is :" << demo.capacity() << endl;
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
//iter迭代器指向元素 3
cout << endl << *iter << endl;
return 0;
}
输出结果:
size is :4
capacity is :5
1 3 4 5
3
如果不在意容器中元素的排列顺序,可以结合 swap() 和 pop_back() 函数,同样可以实现删除容器中指定位置元素的目的。
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int>demo{ 1,2,3,4,5 };
//交换要删除元素和最后一个元素的位置
swap(*(std::begin(demo)+1),*(std::end(demo)-1));//等同于 swap(demo[1],demo[4])
//交换位置后的demo容器
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
demo.pop_back();
cout << endl << "size is :" << demo.size() << endl;
cout << "capacity is :" << demo.capacity() << endl;
//输出demo 容器中剩余的元素
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
return 0;
}
输出结果:
1 5 3 4 2
size is :4
capacity is :5
1 5 3 4
还可以删除一个区间内所有元素:iterator erase (iterator first, iterator last);
其中 first 和 last 是指定被删除元素区域的迭代器,同时该函数会返回指向此区域之后一个位置的迭代器。
auto iter = demo.erase(demo.begin()+1, demo.end() - 2);
remove()
如果要删除容器中和指定元素值相同的所有元素,可以使用 remove() 函数
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int>demo{ 1,3,3,4,3,5 };
//交换要删除元素和最后一个元素的位置
auto iter = std::remove(demo.begin(), demo.end(), 3);
cout << "size is :" << demo.size() << endl;
cout << "capacity is :" << demo.capacity() << endl;
//输出剩余的元素
for (auto first = demo.begin(); first < iter;++first) {
cout << *first << " ";
}
return 0;
}
输出:
size is :6
capacity is :6
1 4 5
注意,在对容器执行完 remove() 函数之后,由于该函数并没有改变容器原来的大小和容量,因此无法使用之前的方法遍历容器,而是需要向程序中那样,借助 remove() 返回的迭代器完成正确的遍历。
clear()
直接用即可。
set,map的用法
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <bits/stdc++.h>
using namespace std;
int main() {
map<string, int> mp;
mp.insert({"mp", 1});
mp.insert({"mp1", 2});
set<int> ss;
int a[100] = {1, 2, 3, 4, 5};
for(int i = 4; i >= 0; i --)
ss.insert(a[i]);
for(map<string, int> :: iterator i = mp.begin(); i != mp.end(); i ++)
{
cout << i->first << ' ' << i->second << endl;
}
for(auto i = ss.begin(); i != ss.end(); i ++)
{
cout << *i << ' ';
}
return 0;
}