使用C++中vector容器时必须包含
#include <vector>
using namespace std;
vector基本概念
vector:向量(动态数组),内存分配原理与string相同,是连续的空间,空间不够用时,申请一个更大的空间,迭代器失效
功能:vector数据结构和数组非常相似,也称为单端数组
vector与普通数组区别:数组是静态空间,vector可以动态扩展
vector构造函数
功能:创建vector容器
①vector<T> v;
采用模板实现类实现,默认构造函数
②vector(v.begin(),v.end());
将v[begin(),end()]区间中的元素拷贝给自身
③vector(n,elem);
构造函数将n个elem拷贝给自身
④vector(const vector &v);
拷贝构造函数
举例:
#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 test(){
vector<int> v1; //无参构造函数,即默认构造
for(int i=0;i<10;i++){ //给容器v1赋值
v1.push_back(i);
}
printVector(v1); //调用打印函数
vector<int> v2(v1.begin(),v1.end()); //通过区间方式进行构造
printVector(v2);
vector<int> v3(5, 20); //构造函数将n个elem拷贝给自身
printVector(v3);
vector<int> v4(v3); //拷贝构造
printVector(v4);
}
int main(){
test();
system("pause");
}
输出:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
20 20 20 20 20
20 20 20 20 20
vector赋值操作
功能:给vector容器进行赋值
①vector& operator=(const vector &v);
重载=操作符
②assign(begin,end);
将[begin,end)区间中的数据拷贝赋值给本身
③assign(n,elem);
将n个elem拷贝赋值给本身
举例:
#include <iostream>
using namespace std;
#include <vector>
void printVector(vector<int> &v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test() {
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()); //将[begin, end)区间中的数据拷贝赋值给本身
printVector(v3);
vector<int> v4;
v4.assign(5, 20); //将n个elem拷贝赋值给本身
printVector(v4);
}
int main() {
test();
system("pause");
}
输出:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
20 20 20 20 20
vector容量和大小
功能:对vector容器的容量和大小进行操作
①empty();
判断容器是否为空,返回值为0,不为空,否则为空
②capacity();
容器的容量,初始容量:定义对象时,初始化几个容量就是几,无参就是0
Visual Studio容量不够时,增加现有容量的一半(向下取整)
VC6.0容量不够时,增加现有容量的一倍
③size();
返回容器中元素的个数
④resize(int num);
重新设置容器的长度为num,若容器变长,则以默认值(0)填充新位置;若容器变短,删除末尾超出容器长度的元素
⑤resize(int num,elem);
重新设置容器长度为num,并以elem替换默认以0填充的值
举例:
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int> &v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
printVector(v1);
cout << v1.empty() << endl;
cout << "v1的容量为:" << v1.capacity() << endl;
cout << "v1的大小为:" << v1.size() << endl;
v1.resize(15); //重新设置容器大小,变大的部分以0填充
printVector(v1);
vector<int> v2;
for (int i = 0; i < 8; i++) {
v2.push_back(i);
}
printVector(v2);
v2.resize(15, 9); //重新设置容器大小,变大的部分以9填充
printVector(v2);
v2.resize(10); //重新设置容器大小,变小,删除末尾多余元素
printVector(v2);
}
int main() {
test();
system("pause");
}
输出:
0 1 2 3 4 5 6 7 8 9
0 //返回0说明容器不为空
v1的容量为:13
v1的大小为:10
0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 9 9 9 9 9 9 9
0 1 2 3 4 5 6 7 9 9
vector插入和删除
插入:
①push_back(i);
尾部插入元素i
②insert(const_iterator pos,i);
在迭代器指向位置pos上插入元素i
③insert(const_iterator pos,int count,i);
在迭代器指向位置pos上插入count个元素i
④insert(const_iterator pos,const_iterator first, const_iterator second);
在迭代器指向位置pos上插入另一个迭代器的从first位置到second位置的元素
删除:
⑤pop_back();
删除最后一个元素
⑥erase(const_iterator pos);
删除迭代器指向的元素
⑦erase(const_iterator start, const_iterator end);
删除迭代器指向的从start位置至end位置之间的元素
⑧clear();
删除容器中所有元素
举例:
#include <iostream>
using namespace std;
#include <vector>
void printVector(vector<int> &v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test() {
vector<int> v1;
v1.push_back(5); //在迭代器尾部插入元素
v1.push_back(6);
v1.push_back(7);
printVector(v1);
v1.insert(v1.begin() + 2, 12); //在迭代器指向的位置(下标为2)插入元素12
printVector(v1);
v1.insert(v1.begin(), 5, 8); //在迭代器指向位置插入5个8
printVector(v1);
vector<int> v2(5, 1);
v1.insert(v1.begin() + 2, v2.begin(), v2.end()); 在迭代器指向位置插入迭代器v2的所有值
printVector(v1);
v1.pop_back(); //删除迭代器尾部元素
printVector(v1);
v1.erase(v1.begin()); //删除迭代器头部元素
printVector(v1);
v1.erase(v1.begin(), v1.begin() + 2); //删除迭代器首部两个元素
printVector(v1);
v1.clear(); //清空迭代器中的元素
printVector(v1);
}
int main() {
test();
system("pause");
}
输出:
5 6 7
5 6 12 7
8 8 8 8 8 5 6 12 7
8 8 1 1 1 1 1 8 8 8 5 6 12 7
8 8 1 1 1 1 1 8 8 8 5 6 12
8 1 1 1 1 1 8 8 8 5 6 12
1 1 1 1 8 8 8 5 6 12
vector数据存取
①operator[i];
返回索引i所指的数据
②at(i);
返回索引i所指的数据
③front();
返回容器中第一个数据元素
④back();
返回容器中最后一个数据元素
#include<iostream>
using namespace std;
#include<vector>
void test() {
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的第一个元素:" << v1.front() << endl;
cout << "v1的最后一个元素:" << v1.back() << endl;
}
int main() {
test();
system("pause");
}
输出:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
v1的第一个元素:0
v1的最后一个元素:9
vector互换容器
功能:实现两个容器内的元素进行互换
swap(v);
将容器v中元素与当前容器中的元素进行互换
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int> &v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test() {
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);
}
int main() {
test();
system("pause");
}
输出:
交换前:
0 1 2 3 4 5 6 7 8 9
10 9 8 7 6 5 4 3 2 1
交换后:
10 9 8 7 6 5 4 3 2 1
0 1 2 3 4 5 6 7 8 9
vector预留空间
reserve(int len);
预留len个元素长度的空间,用以减少vector在动态扩展容量时的扩展次数
vector<int> v;
v.reserve(1000); //预留1000个元素长度的空间,不用动态扩展,可直接使用