向量容器Vector

  • 1. 定义/初始化
  • 2. 遍历
  • 3. 常用操作
  • vector迭代器遍历, sort, reverse,

1. 定义/初始化

vector是同一类型对象的集合,被称作容器。vector实际是一个类模版,可用于保存多种数据类型的数据(确定类型的vector 就只能装同种数据)。模版类决定了vector 声明时需要提供的信息。⚠️Vector 不是一种数据类型,但是创建容器对象的类是_初始化创建容器对象的类是_数据_02,… 都是数据类型。

Vector Vs 数组:

  1. 动态数组,可以在运行阶段设置长度
  2. 具有数组的快速索引方式
  3. 可以插入和删除元素

定义和初始化- -尖角号:范型编程

# 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中不要放复杂对象,要放指针。