一、概述
针对顺序表的一些常用操作,来简单介绍一下C++STL中的vector容器
二、基本操作
1. 创建
#include <cstdio>
#include <iostream>
#include <vector> //必须加入的头文件
using namespace std;
int main()
{
//创建一个vector容器
vector<int> v;
return 0;
}
2. 查看大小
2.1 size()
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
int v_size = v.size(); //查看vector容器存储元素的数量
printf("%d",v_size);
return 0;
}
2.2 判空:empty()
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
//判空
if(v.empty())
printf("vector为空\n");
else
printf("vector不为空\n");
return 0;
}
3. 增加元素
3.1 push_back( e(插入的元素) )
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
return 0;
}
3.2 insert(v.begin() + place(插入的位置,从0开始) , e(插入的元素) )
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//插入元素
//在头部插入
v.insert(v.begin(), 11);
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//在中间插入
v.insert(v.begin() + 4, 12);
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
return 0;
}
4. 删除元素
4.1 删除一个
(1) erase(v.begin() + place (删除元素的位置))
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//删除一个元素
v.erase(v.begin() + 4);
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
return 0;
}
(2) pop_back():删除尾部元素
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//删除尾部元素元素
v.pop_back();
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
return 0;
}
4.2 删除部分元素:erase(v.begin() + from, v.begin() + to) 注意:这里的删除的区间是左闭右开的
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//删除部分元素
v.erase(v.begin() + 5, v.begin() + 10);
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
return 0;
}
4.3 删除全部元素:clear()
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//删除全部元素
v.clear();
printf("%d\n",v.size());
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
return 0;
}
5.修改元素
5.1 直接修改
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//修改元素
v[0] = 11;
v[v.size() / 2 - 1] = 12;
v[v.size() - 1] = 13;
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
return 0;
}
6. 查看元素
6.1 front():查看第一个元素
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
printf("%d\n", v.front()); //查看第一个元素
return 0;
}
6.2 back():查看最后一个元素
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
printf("%d\n", v.back()); //查看最后一个元素
return 0;
}
6.3 find():查找指定值
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm> //要使用find()方法必须加入这个头文件
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
vector<int>::iterator it = find(v.begin(), v.end(), 5); //若找到,返回该元素所在的迭代器位置,否则,返回v.end()
if(it != v.end())
printf("%d\n",*(it));
return 0;
}
当查找元素是结构体时
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm> //要使用find()方法必须加入这个头文件
using namespace std;
struct student{
char name[7];
int age;
bool operator == (const student &s) //必须重写 == 运算符
{
return !strcmp(this->name, s.name);
}
};
int main()
{
vector<student> stus;
for(int i = 1; i <= 2; i++)
{
student s;
scanf("%s %d",s.name, &s.age);
stus.push_back(s);
}
student s;
scanf("%s",s.name);
vector<student>::iterator it = find(stus.begin(), stus.end(), s);
if(it != stus.end())
printf("有此人");
else
printf("无此人");
return 0;
}
7. 遍历
7.1 迭代器遍历
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
vector<int>::iterator it; //定义vector迭代器
for(it = v.begin(); it != v.end(); it++)
printf("%d ",*it);
//若元素为结构体的话,则要采用这种形式:(*it).element
return 0;
}
8. 排序
8.1 使用中的sort()函数
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm> //必须加入的头文件
using namespace std;
typedef struct student{
char name[4];
int age;
}Student
bool compare(Student a, Student b)
{
return a.age < b.age //升序
//return a.age > b.age //降序
}
int main()
{
vector<int> v;
vector<Student> stus;
for(int i = 1; i <= 10; i++)
{
v.push_back(i);
Student s;
s.age = i;
stus.push_back(s);
}
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//降序排序
sort(v.begin(), v.end(), greater<int>());
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//升序排序
sort(v.begin(), v.end()); //或者 sort(v.begin(), v.end(), less<int>())
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//结构体排序,需要定义一个compare函数
sort(stus.begin(), stus.end(), compare);
return 0;
}
9. 翻转
9.1 使用中的reverse()函数
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm> //必须加入的头文件
using namespace std;
int main()
{
vector<int> v;
for(int i = 1; i <= 10; i++)
v.push_back(i); //向尾部添加元素
//显示
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
//翻转
reverse(v.begin(), v.end());
for(int i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
return 0;
}