C++学习(19)—— vector容器
1.vector基本概念
功能:
- vector数据结构和数组非常相似,也成为单端数组
vector与普通数组区别:
- 不同之处在于数组是静态空间,而vctor可以动态扩展
动态扩展:
- 并不是在原空间之后续借新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间
- vector容器的迭代器是支持随机访问的迭代器
2.vector构造函数
功能描述:
- 创建vector容器
函数原型:
vector<T> v;
//采用模板实现类实现,默认构造函数vector(v.begin(), v.end());
//将[v.begin(), v.end())区间中的元素拷贝给本身vector(n, elem);
//构造函数将n个elem拷贝给本身vector(const vector &vec);
//拷贝构造函数
#include<iostream>
#include<vector>
using namespace std;
void printVector(vector<int>v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
//默认构造
vector<int>v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
printVector(v1);
//通过区间方式进行构造
vector<int>v2(v1.begin(), v1.end());
printVector(v2);
//n个elem方式构造
vector<int>v3(10, 100);
printVector(v3);
//拷贝构造
vector<int>v4(v3);
printVector(v4);
}
int main() {
test01();
system("pause");
return 0;
}
3.vector赋值操作
功能描述:
- 给vector容器进行赋值
函数原型:
vector& operator=(const vector &vec);
//重载等号操作符assign(beg, end);
//将[beg, end)区间中的数据拷贝赋值给本身assign(n,elem);
//将n个elem拷贝赋值给本身
#include<iostream>
#include<vector>
using namespace std;
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
vector<int>v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
printVector(v1);
vector<int>v2;
v2 = v1;
printVector(v2);
vector<int>v3;
v3.assign(v1.begin(), v1.end());
printVector(v3);
vector<int>v4;
v4.assign(10, 100);
printVector(v4);
}
int main() {
test01();
system("pause");
return 0;
}
4.vector容量和大小
功能描述:
- 对vector容器的容量和大小操作
函数模型:
-
empty();
//判断容器是否为空 -
capacity();
//容器的容量 -
size();
//返回容器中元素的个数 -
resize(int num);
//重新指定容器的长度为num,若容器变长,则以默认值填充新位置 //如果容器变短,则末尾超出容器长度的元素被删除
-
resize(int num, elem)
//重新指定容器的长度为num,若容器变长,则以elem填充新位置
#include<iostream>
#include<vector>
using namespace std;
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
vector<int>v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
printVector(v1);
if (v1.empty()) {
cout << "v1为空" << endl;
}
else {
cout << "v1不为空" << endl;
cout << "v1的容量为" << v1.capacity() << endl;
cout << "v1的大小为" << v1.size() << endl;
}
//重新指定大小
v1.resize(15);
printVector(v1);
v1.resize(18, 100);
printVector(v1);
v1.resize(8);
printVector(v1);
}
int main() {
test01();
system("pause");
return 0;
}
5.vector插入和删除
功能描述:
- 对vector容器进行插入、删除操作
函数原型:
push_back(ele);
//尾部插入元素elepop_back();
//删除最后一个元素insert(const_iterator pos, ele);
//迭代器指向位置pos插入元素eleinsert(const_iterator pos, int count, ele);
//迭代器指向位置pos插入count个元素eleerase(const_iterator pos);
//删除迭代器指向的元素erase(const_iterator start, const_iterator end);
//删除迭代器从start到end之间的元素clear();
//删除容器中所有元素
#include<iostream>
#include<vector>
using namespace std;
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
//尾插
vector<int>v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
//遍历
printVector(v1);
//尾删
v1.pop_back();
printVector(v1);
//插入
v1.insert(v1.begin(), 100);
printVector(v1);
v1.insert(v1.begin(), 2, 1000);
printVector(v1);
//删除
v1.erase(v1.begin());
printVector(v1);
v1.erase(v1.begin(), v1.end()); //v1.clear();
}
int main() {
test01();
system("pause");
return 0;
}
6.vector数据存取
功能描述:
- 对vector中的数据的存取操作
函数原型:
at(int idx);
//返回索引idx所指的数据operator[];
//返回索引idx所指的数据front();
//返回容器中第一个数据元素back();
//返回容器中最后一个数据元素
#include<iostream>
#include<vector>
using namespace std;
void test01() {
vector<int>v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";
}
cout << endl;
for (int i = 0; i < v1.size(); i++) {
cout << v1.at(i) << " ";
}
cout << endl;
cout << "第一个元素为:" << v1.front() << endl;
cout << "最后一个元素为:" << v1.back() << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:
- 除了用迭代器获取vector容器中元素,[]和at也可以
- front返回容器第一个元素
- back返回容器最后一个元素
7.vector互换容器
功能描述:
- 实现两个容器内元素进行互换
函数原型:
swap(vec);
//将vec与本身的元素互换
#include<iostream>
#include<vector>
using namespace std;
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//1.基本使用
void test01() {
vector<int>v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
cout << "交换前:" << endl;
printVector(v1);
vector<int>v2;
for (int i = 10; i > 0; i--) {
v2.push_back(i);
}
printVector(v2);
cout << "交换后:" << endl;
v1.swap(v2);
printVector(v1);
printVector(v2);
}
//2.实际用途
//巧用swap可以收缩内存空间
void test02() {
vector<int>v;
for (int i = 0; i < 100000; i++) {
v.push_back(i);
}
cout << "v的容量:" << v.capacity() << endl;
cout << "v的大小:" << v.size() << endl;
v.resize(3); //重新指定大小
cout << "v的容量:" << v.capacity() << endl;
cout << "v的大小:" << v.size() << endl;
//巧用swap收缩内存
vector<int>(v).swap(v);
cout << "v的容量:" << v.capacity() << endl;
cout << "v的大小:" << v.size() << endl;
}
int main() {
test02();
system("pause");
return 0;
}
总结:swap可以使两个容器互换,可以达到实用的收缩内存效果
8.vector预留空间
功能描述:
- 减少vector在动态扩展容量时的扩展次数
函数原型:
reserve(int len);
//容器预留len个元素长度,预留位置不初始化,元素不可访问
#include<iostream>
#include<vector>
using namespace std;
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//1.基本使用
void test01() {
vector<int>v1;
//利用reserve预留空间
v1.reserve(100000);
int num = 0;
int *p = NULL;
for (int i = 0; i < 100000; i++) {
v1.push_back(i);
if (p != &v1[0]) {
p = &v1[0];
num++;
}
}
cout << num << endl;
cout << "v的容量:" << v1.capacity() << endl;
cout << "v的大小:" << v1.size() << endl;
}
int main() {
test01();
system("pause");
return 0;
}
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.