Skip to content

vector容器

vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。

Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运

使用vector需要引入头文件vector,并且属于std命名空间内

vector是一个模板类,在创建vector变量时,需要使用<>定义容器内值的类型

c++
#include <vector>

int main(){
    std::vector<int> v;
}

1.vector的遍历

1.1 迭代器

begin()end()函数是vector实例对象上的函数

  • begin():指向一个vector容器首个值的位置
  • end():指向一个vector容器最后一个值的下一个位置

需要使用vector中的iterator定义一个迭代器指针来指向begin()返回的位置

使用push_back()vector容器后面添加一个元素

c++
#include <iostream>
#include <vector>
using namespace std;

int main() {

    vector<int> v;
    v.push_back(1);

    vector<int>::iterator it = v.begin();		// 指向首元素的地址
    cout << *it;    // 1,首元素的值

    return 0;
}

1.2 迭代器遍历

c++
#include <iostream>
#include <vector>
using namespace std;

int main() {

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);


	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << ",";			// 1,2,3,4,5,
	}

	return 0;
}

因为每次循环的循环遍历是个指针,指向每次循环中容器中的值,所以我们可以通过*it修改容器中的值

c++
#include <iostream>
#include <vector>
using namespace std;

int main() {

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);


	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		*it = *it + 1;
	}

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << ",";    		 // 2,3,4,5,6
	}


	return 0;
}

倒叙遍历

c++
for (vector<int>::iterator it = v.end(); it != v.begin();) {
	it--;
	cout << *it << ",";
}

1.3 元素迭代遍历

语法

c++
for(vector元素类型 循环遍历: vector遍变量){
    cout <<ele;
}

和遍历数组一样

c++
#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	for (int ele : v) {
		cout << ele << ",";			// 1,2,3,4,5
	}

	return 0;
}

若想在循环中修改循环遍历的值,需要使用引用

c++
#include <iostream>
#include <vector>
using namespace std;

int main() {

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);


	for (int& ele : v) {
		ele++;
	}
	for (int& ele : v) {
		cout << ele << ",";   // 2,3,4,5,6
	}

	return 0;
}

封装成函数供后续使用

c++
void printVector(vector<int> &v) {
	for (int& ele : v) {
		cout << ele << ",";
	}
}

2.vector构造函数

2.1 无参构造函数

创建一个空的vector变量

c++
vector<int> v;

2.2 创建指定数量值

创建一个vector变量,里面填充了n个值,每个值都为ele

若ele不穿,则每个值都是0

c++
vector<int> v(n, ele);

2.3 拷贝构造函数

需要根据一个已有的vector变量来创建另一个vector变量

c++
vector<int> v;
vector<int> v1(const vector& v);

2.4 根据已有变量截取

c++
vector<int> v(start, end);
  • start:指向已有vector变量的位置,作为新vector变量的开始值
  • end:指向已有vector变量的位置,作为新vector变量的结束值
c++
vector<int> v(10, 5);

vector<int> v1(v.begin(), v.end())  // 把v中的数据,复制到v1中
    
vector<int> v2(v.begin(), v.begin()+3);   // 把v中的前三个数据,复制到v1中

3.vector的赋值

3.1 assign()

3.1.1 assign(beg, end)

将[beg, end)区间中的数据拷贝赋值给本身,beg, end为指针

c++
vector<int> v;
v.assign(beg, end);

将一个vector容器中的值赋值给另一个vector容器

c++
int main() {
    vector<int> v1(10,5);

    vector<int> v2;
    v2.assign(v1.begin(), v1.begin() + 3);   // 赋值前三个值
    printVector(v2);    // 5,5,5
}

将数组中的值赋值给vector容器

c++
int main() {
	int arr[] = { 1,2,3,4,5 };
	vector<int> v;
	v.assign(arr, arr + 5);
	printVector(v);
	return 0;
}

3.1.2 assign(n, ele)

将n个ele拷贝给本身,相当于构造函数 vector<int> v(n, ele);

c++
vector<int> v;
v.assign(10, 5);	// 赋值10个5

3.2 vector的 = 重载

可以把一个vector容器直接赋值给另一个vector容器

c++
int main() {
	vector<int> v(5,10);
	vector<int> v1 = v;

	printVector(v1);		// 10,10,10,10,10
	return 0;
}

直接赋值一个数组

c++
int main() {
	vector<int> v = {1,2,3,4,5};
	printVector(v);  // 1,2,3,4,5

	return 0;
}

3.3 swap()

交换两个vetcor中的值

c++
int main() {
	vector<int> v = { 1,2,3,4,5 };
	vector<int> v1 = { 6,7,8,9,10 };

	v1.swap(v);

	printVector(v);  // 6,7,8,9,10,
	printVector(v1);  //  1,2,3,4,5,

	return 0;
}

4.vector的大小操作

4.1 size()

size()函数用来获取vector容器里实际存放元素的数量

c++
int main() {
	vector<int> v(5,10);
	cout << v.size();   // 5
	return 0;
}

4.2 empty()

判断容器是否为空,返回bool

c++
int main() {
	vector<int> v;

	cout << v.empty();  // 1

	v.assign(5, 10);

	cout << v.empty();  // 0

	return 0;
}

4.4 capacity()

返回容器的容量在内存上开辟了多少个空间

4.5 resize()

c++
resize(size, ele)
  • size:重新指定的长度
  • ele:若新长度大于原来的长度,给新元素填充的内容,若新长度小于原来的长度,则此参数没有意义

若新长度小于原来的长度,则保留容器之前指定数量的元素,后面的元素不可见

c++
int main() {
	vector<int> v(5,10);
	printVector(v);  // 10,10,10,10,10

	v.resize(3);
	printVector(v);  // 10,10,10

	return 0;
}

若新长度大于原来的长度,则后面的元素默认填充为0,也可以指定填充内容

c++
int main() {
	vector<int> v(5,10);
	printVector(v);  // 10,10,10,10,10

	v.resize(10);
	printVector(v);  // 10,10,10,10,10,0,0,0,0,0,

	v.resize(15,6);		// 指定填充内容
	printVector(v);  // 10,10,10,10,10,0,0,0,0,0,6,6,6,6,6,

	return 0;
}

5.vector的数据存取操作

5.1 at(int index)

返回指定下标的内容

c++
int main() {
	vector<int> v = {1,2,3,4,5};

	cout << v.at(0) << endl;	// 1
	cout << v.at(1) << endl;	// 2
	cout << v.at(2) << endl;	// 3
	cout << v.at(3) << endl;	// 4
	cout << v.at(4) << endl;	// 5
	

	return 0;
}

5.2 [] 运算符重载

可获取指定下标的内容

c++
int main() {
	vector<int> v = {1,2,3,4,5};

	cout << v[0] << endl;	// 1
	cout << v[1] << endl;	// 2
	cout << v[2] << endl;	// 3
	cout << v[3] << endl;	// 4
	cout << v[4] << endl;	// 5
	

	return 0;
}

5.3 front()

返回容器中第一个元素

c++
int main() {
	vector<int> v = {1,2,3,4,5};

	cout << v.front() << endl;	// 1
	
	return 0;
}

5.4 back()

返回容器中最后一个元素

c++
int main() {
	vector<int> v = { 1,2,3,4,5 };

	cout << v.front() << endl;	// 1
	cout << v.back() << endl;	// 5

	return 0;
}

6.vector的插入和删除

6.1 insert()

指定位置插入指定数量元素,注意参数不是下表,而是迭代器指针

c++
insert(const_iterator pos, int count, ele);
  • pos:迭代器指向位置插入
  • count:元素个数
  • ele:元素的值
c++
int main() {
	vector<int> v = { 1,2,3,4,5 };

	v.insert(v.begin() + 1, 5, 0);  //1,0,0,0,0,0,2,3,4,5,
	printVector(v);
	return 0;
}

6.2 push_back()

容器尾部插入一个元素

c++
push_back(ele);
  • ele:插入元素的值
c++
int main() {
	vector<int> v = { 1,2,3,4,5 };

	v.push_back(200);
	printVector(v);  // 1,2,3,4,5,200
	return 0;
}

6.3 pop_back()

容器尾部删除一个元素

c++
int main() {
	vector<int> v = { 1,2,3,4,5 };
	v.pop_back();
    
	printVector(v);  // 1,2,3,4
	return 0;
}

6.4 erase()

删除迭代器指定范围的元素

c++
erase(const_iterator start, const_iterator end);
  • start:删除范围元素的开始位置
  • end:删除范围元素的结束位置

删除迭代器指定位置的元素

c++
erase(const_iterator pos);
  • pos:指定元素的位置
c++
int main() {
	vector<int> v = { 1,2,3,4,5 };


	v.erase(v.begin(), v.begin()+2); // 3, 4, 5,
	printVector(v);

	vector<int> v1 = { 1,2,3,4,5 };
	v1.erase(v1.begin() + 3);
	printVector(v1);		// 1,2,3,5

	return 0;
}

6.5 clear()

删除容器中所有元素

c++
int main() {
	vector<int> v = { 1,2,3,4,5 };

	v.clear();
	printVector(v); // 空
    
	return 0;
}

MIT Licensed