C++ STL丨vector 基本使用(一)
文章目录
1 vector
向量
向量 vector
是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string
相同, vector 同属于STL
(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。
2 使用速查表
函数 | 解释 |
---|---|
vector<Elem> c | 创建一个空的vector |
c.insert(pos, elem) | 在pos位置插入一个elem拷贝,传回新数据位置 |
c.insert(pos,n,elem) | 在pos位置插入n个elem数据。无返回值 |
c.insert(pos,beg,end) | 在pos位置插入在[beg,end)区间的数据。无返回值 |
c.pop_back() | 删除最后一个数据 |
c.push_back(elem) | 在尾部加入一个数据 |
c.erase(pos) | 删除pos位置的数据,传回下一个数据的位置 |
c.erase(beg,end) | 删除[beg,end)区间的数据,传回下一个数据的位置 |
c.assign(beg, end) | 将[beg; end)区间中的数据赋值给c |
c.assign(n, elem) | 将n个elem的拷贝赋值给c |
c.at(idx) | 传回索引idx所指的数据,如果idx越界,抛出out_of_range |
c.back() | 传回最后一个数据,不检查这个数据是否存在 |
c.begin() | 传回迭代器中的第一个位置 |
c.capacity() | 返回容器中数据的个数 |
c.clear() | 移除数据中所有数据 |
c.empty() | 判断容器是否为空 |
c.end() | 返回容器的最后一个元素后面的元素的迭代器 |
c.front | 传回第一个数据 |
c.max_size() | 返回容器中最大元素数 |
c.rbegin() | 传回一个逆向队列的第一个数据 |
c.rend() | 传回一个逆向队列的最后一个数据的下一个位置 |
c.resize(num) | 重新指定队列的长度 |
c.reserve() | 保留适当的容量 |
c.size() | 返回容器中实际数据的个数 |
c.data() | 指向底层元素存储的指针。对于非空容器,返回的指针比较等于第一个元素的地址。 |
c1.swap(c2) | 将c1和c2元素互换 |
3 详细使用
3.1 vector 初始化
vector 初始化:
vector<int> v; //初始化v
vector<int> v(10, 1); //v中初始化10个1
vector<int> v(v1); //将v1拷贝给v
vector<int> v(v1.beg, v2.end); //将v1中第一个到结束,拷贝给v
3.2 vector 插入
insetr 使用:
#include <iostream>
#include <vector>
void print_vec(const std::vector<int>& vec)
{
for (auto x: vec) {
std::cout << ' ' << x;
}
std::cout << '\n';
}
int main ()
{
std::vector<int> vec(3,100); //初始化3个100
print_vec(vec);
auto it = vec.begin();
it = vec.insert(it, 200); //第一个位置插入 200
print_vec(vec);
vec.insert(it,2,300); //it位置插入 2 个 300
print_vec(vec);
// "it" no longer valid, get a new one:
it = vec.begin(); //插入之后未返回值,需要重新赋值
std::vector<int> vec2(2,400);
vec.insert(it+2, vec2.begin(), vec2.end());
print_vec(vec);
int arr[] = { 501,502,503 };
vec.insert(vec.begin(), arr, arr+3);
print_vec(vec);
}
输出:
100 100 100
200 100 100 100
300 300 200 100 100 100
300 300 400 400 200 100 100 100
501 502 503 300 300 400 400 200 100 100 100
3.3 vector 遍历
vector<int> v(3, 2);
for (auto i : v) //使用新特性遍历
cout << v[i] << endl;
for (auto&& i : v) //右值引用 lambda表达式
cout << v[i] << endl;
for (int i = 0; i < v.size(); i++) //使用下标
cout << v[i] << endl;
// 使用迭代器
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
cout << *it << endl;
3.4 vector 插入和删除
push_back() 和 pop_back() 使用:
vector<int> n;
n.push_back(2); //尾插入2
n.push_back(4); //尾插入4, 当前元素为2 4
n.pop_back(); //弹出尾元素,当前元素为 2
3.5 vector 删除指定元素
erase 使用:
#include <vector>
#include <iostream>
int main( )
{
std::vector<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto &i : c) {
std::cout << i << " ";
}
std::cout << '\n';
c.erase(c.begin()); //删除第一个元素
for (auto &i : c) {
std::cout << i << " ";
}
std::cout << '\n';
c.erase(c.begin()+2, c.begin()+5); //删除下标[2,5)之间元素
for (auto &i : c) {
std::cout << i << " ";
}
std::cout << '\n';
// Erase all even numbers (C++11 and later)
for (auto it = c.begin(); it != c.end(); ) { //删除偶数
if (*it % 2 == 0) {
it = c.erase(it);
} else {
++it;
}
}
for (auto &i : c) {
std::cout << i << " ";
}
std::cout << '\n';
}
输出:
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 6 7 8 9
1 7 9