您的位置:首页 > 编程语言 > C语言/C++

vector中函数的使用

2016-07-20 11:50 405 查看
容器(container):可容纳一些数据的模板类,STL中有vector、set、map、multimap和deque等容器。

游标(iterator):是一个指针,用来指向STL容器中的元素。

vector是一个能够操作多种数据类型和算法的模板类和函数库,是C++标准模板库中的部分内容

vector被认为是一个容器,能够像容器一样存放任意类型的动态数组

头文件为:

#include <vector>


vector属于std命名域的,使用全局的命名域方式:

using namespace std;
vector<int> v;


等价于

std::vector<int> v;


vector的声明

vector<ElemType> c;//创建一个空的vector
vector<ElemType> c1(c2);//创建一个vector c1,并用c2初始化c1
vector<ElemType> c(n);//创建一个含有n个ElemType类型数据的vector
vector<ElemType> c(n,elem);//创建一个含有n个ElemType类型数据的vector,并全部初始化为elem
c.~vector<ElemType>();//销毁所有数据,释放资源


vector容器中常用的函数,c是一个容器对象

容器对象c

下标
011
145
213
388
c.begin()是一个指针,指向内存中的值为2,注意c.end()指向内存中的值不是88;

c.push_back(elem);//在容器最后位置添加一个元素elem
c.pop_back();//删除容器最后位置处的元素
c.at(index);//返回指定index位置处的元素
c.begin();//返回指向容器最开始位置数据的指针
c.end();//返回指向容器最后一个数据单元的指针+1
c.front();//返回容器最开始单元数据的引用
c.max_size();//返回容器的最大容量
c.size();//返回当前容器中实际存放元素的个数,同c.capacity()
c.erase(p);//删除指针p指向位置的数据,返回指向下一个位置的指针
c.clear();//清除所有数据,capacity保持不变,size变成0
c.empty();//判断容器是否为空,若为空返回true,否则返回false
c1.swap(c2);//交换两个容器中的数据,两个容器的size一定相等,capacity可以不等
c.insert(p,elem);//在指针p指向的位置插入数据elem,返回指向elem位置的指针
c.insert(p,n,elem);//在指针p指向的位置插入n个elem数据,无返回值
c.insert(p,begin,end); //在位置p插入在区间[begin,end)的数据,无返回值


c.rbegin();//将vector反转后的开始指针返回(其实就是原来的end-1)

c.rend();//将vector反转后的结束指针返回(其实就是原来的begin-1)

insert()函数的使用

#include<vector>
#include<iostream>
#include <stdlib.h>
using namespace std;
int main()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.insert(v.begin(), 8);//在下标为0的元素前面插入新元素
v.insert(v.begin() + 2, 40);//在下标为2的元素前面插入新元素
v.insert(v.end(), 50);//在向量末尾追加新元素

/********遍历容器内的值***********/
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
//----------------------------------/
system("pause");
return 0;
}


reserve()和resize()的区别

reserve()可改变capacity,不改变size,可分配内存,不会构造出对象;如果改变后的capacity比当前capacity大,则capacity会变大,反之,capacity不变;

resize()可改变size,可能改变capacity。如果改变后的size比当前capacity大,则capacity会变大,同时构造出多出来的对象,反之,capacity不变,同时析构一些不再需要的对象;

reserve()和resize()都不会使capacity变小,但都有可能使capacity变大,reserve()能准确控制capacity,而resize()不能,vc里是每次增大一半的当前capacity。如果不去使用reserve()和resize(),每当capacity不够时,就会去分配一块新的够大的内存,再释放以前的内存,因此效率很低。

vector中的操作

c.[i];同at()函数的作用相同,即取容器中的数据;

数据的输入与删除

#include<vector>
#include<iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int i, n;
vector<int> v;
for (i = 0; i < 5; i++) {
scanf_s("%d", &n);
v.push_back(n);//push_back(n)将元素添加到数组最后
}
for (i = 0; i < v.size(); i++) {
printf("%d ", v[i]);
}
printf("\n");
v.pop_back();//pop_back()将数组最后一个元素删除
for (i = 0; i < v.size(); i++) {
printf("%d ", v[i]);
}
printf("\n");
system("pause");
return 0;
}


元素的访问

#include<vector>
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int i, n;
vector<int> v;
vector<int>::iterator it;//声明一个vector的迭代器
for (i = 0; i < 10; i++) {
scanf_s("%d", &n);
v.push_back(n);
}
for (i = 0; i < v.size(); i++) {
printf("%d ", v[i]);//第一种方法,访问通过操作[]
}
printf("\n");
for (i = 0; i < v.size(); i++) {
printf("%d ", v.at(i));//第二种方法,通过at(index)函数
}
printf("\n");
for (it = v.begin(); it != v.end(); it++) {
printf("%d ", *it);//第三种方法,通过迭代器iterator访问
}
printf("\n");
system("pause");
return 0;
}


排序和查询

#include<vector>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int main()
{
int i, n;
vector<int> v;
vector<int>::iterator it;//声明一个vector的迭代器
for (i = 0; i < 10; i++) {
scanf_s("%d", &n);
v.push_back(n);
}
it = find(v.begin(), v.end(), 3);//进行查找元素3
if (v.end() == it) {//若无该元素,则返回指向容器最后一个单元+1的指针
printf("该元素不存在于容器中!\n");
}
else {
printf("%d\n", it - v.begin());
}
sort(v.begin(), v.end());//升序进行排序,开始位置到结束位置数值依次增大
reverse(v.begin(), v.end());//降序进行排序,开始位置到结束位置数值依次减小
system("pause");
return 0;
}


二维容器

#include<vector>
#include<iostream>
using namespace std;
int main()
{
int i, j,m;
vector< vector<int> > v;
vector<int> v1;
for (i = 0; i < 4; i++) { //使用二维容器之前一定要对其进行初始化否则会出错
v.push_back(v1);
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
scanf_s("%d", &m);
v[i].push_back(m);
}
}
printf("%d\n", v.size());
for (i = 0; i < v.size(); i++) {
for (j = 0; j < v[i].size(); j++) {
printf("%d ", v[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C-C++ vector STL