向量容器Vector
- 1. 定义/初始化
- 2. 遍历
- 3. 常用操作
- vector迭代器遍历, sort, reverse,
1. 定义/初始化
vector是同一类型对象的集合,被称作容器。vector实际是一个类模版,可用于保存多种数据类型的数据(确定类型的vector 就只能装同种数据)。模版类决定了vector 声明时需要提供的信息。⚠️Vector 不是一种数据类型,但是、,… 都是数据类型。
Vector Vs 数组:
- 动态数组,可以在运行阶段设置长度
- 具有数组的快速索引方式
- 可以插入和删除元素
定义和初始化- -尖角号:范型编程
# include <vector>
using std::vector
vector<T> v1; // vector 保存了类型为T的对象, 默认构造函数,v1 为空
vector<T> v2(v1); // v2 是 v1 的一个副本, 拷贝构造函数?两个是一个地址?
vector<T> v3(n, i); // v3 包含n个为i 的元素
vector<T> v4(n); // v4 含有值初始化的元素的n个元素,具体初始化值由T的默认构造函数决定
vector<T> v5 {a, b, c}; // 创建的同时指定初始值以及元素个数
vector<T> v6 = {a, b, c} // 与v5的初始化方式等价
vector <double> vec1;
vector <string> vec2(5); //分配5个空间, 使用默认值初始化
vector <int> vec3(5,998); //分配5个空间,使用998初始化
vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19}; // 创建的同时指定初始值以及元素个数
vector<int> res = {0, 1};
2. 遍历
vector<int> cards(54, 0);
// way1--C 语言的习惯: 传统for 循环
for(int i = 0; i < cards.size(); i++){
cout << cards[i] << "\t";
}
cout << "\n" << endl;
// way2--C++语言习惯,迭代器的写法
for(vector<int>::const_iterator iter = cards.begin(); iter != cards.end(); iter++){
cout << *iter << ", ";
}
cout << endl; */
// way3--C++11 之后:迭代器的简写版本,类型推断
for(auto iter = cards.begin(); iter != cards.end(); iter++){
cout << *iter << "。 ";
}
cout << endl;
// way4--区间遍历
for(auto card : cards){
cout << card << ":" << getColor(card) << "-" << getValue(card) << "\t";
}
cout << endl;
// 使用算法的方式,将容器的内容复制到cout 绑定的迭代器中
// #include <iterator>
// copy(cards.cbegin(), cards.cend(), ostream_iterator<int>(cout, "- "));
// cout << endl;
3. 常用操作
vector常有的操作:
常用操作 | |
clear() | 移除容器中的所有数据 |
empty() | 判断容器是否为空 |
size() | 返回容器中元素的个数 |
[index],at(index) | 返回索引为index的元素 |
erase(pos) | 删除pos 位置处的数据 |
erase(beg, end) | 删除[beg, end) 区间的数据 |
front() | 返回第一个元素 |
insert(pos, elem) | 在pos位置插入一个元素 |
pop_back() | 删除最后一个元素 |
push_back(elem) | 在容器的末尾插入一个元素 |
resize(num) | 重新设置一个容器的大小 |
begin(),end() | 返回容器首尾元素的迭代器 |
新增两个头文件
#include <vector>
#include <algorithm>
vector迭代器遍历, sort, reverse,
int main(){
// vector <double> vectDouble = {98.5, 67.9, 43.6, 32.9}; c++ 98 中不能初始化并赋初值
vector <double> vectDouble;
// 向数组中插入数字
vectDouble.push_back(100.8);
vectDouble.push_back(99.8);
vectDouble.push_back(102.5);
// 不专业输出
for(int i = 0; i < vectDouble.size(); i++){
cout << vectDouble[i] << "\t";
}
// 集合的通用遍历方法,使用迭代器 iterator
vector<double>::iterator it; //定义一个vector<double>类型的迭代器, 实际上是一个指针
for(it = vectDouble.begin(); it != vectDouble.end(); it++){
cout << *it << "\t";
}
// 排序
sort(vectDouble.begin(), vectDouble.end());
for(it = vectDouble.begin(); it != vectDouble.end(); it++){
cout << *it << "\t";
}
//逆序
reverse(vectDouble.begin(), vectDouble.end());
for(it = vectDouble.begin(); it != vectDouble.end(); it++){
cout << *it << "\t";
}
return 0;
}
定义多大多大,push_back会/可以改变容量,但是效率不高。
当内存容量不够的时候的应对机制:申请一块更大的存储区,将所有的元素放入到新的存储区中。将旧的内存释放掉。
建议vector中不要放复杂对象,要放指针。