vector区别于array,vector是动态数组。主要记录其基本操作、定义、初始化、二维vector
- 头文件:
#include<vector>
- 定义和初始化:
vector v1; // 创建空容器,其对象类型为string类
vector v2(10); //创建有10个具有初始值(即空串)的string类对象的容器
vector v3(5, "hello")//创建有5个值为“hello”的string类对象的容器
vector v4(v3.begin(), v3.end());//v4是与v3相同的容器(完全复制)
- 基本操作:
v.push_back(i)// 在数组的最后添加一个值为i的数据
v.size() //当前使用数据的大小
v[i] //返回v中位置为n的元素,和数组一样
v.erase(it);//删除元素
v.insert(it+y,x)//添加元素,x是元素,it+y是地址
v.empty()//判断vector是否为空
v1=v2 //把v1的元素替换为v2元素的副本
v1==v2//判断v1与v2是否相等
!=、<、<=、>、>= //保持这些操作符惯有含义
v.pop_back()// 移除最后一个元素
v. clear() //清空所有元素
- 迭代器:
it地址和*it元素
vector::iterator it;//最好定义在外面
for(it=v1.begin();it!=v1.end();it++) {cout<<*it<<endl;}
//如:v1.erase(it);先删除后添加v1.insert(it+y,x);
- vector的insert()参数讲解
#include<bits/stdc++.h>
using namespace std;
/*
当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.
vector中insert()的用法详解
*/
int main()
{
//创建一个vector,置入字母表的前4个字符
vector <char> letter;
for( int i=0; i < 4; i++ )
letter.push_back( i + 65 );
/*
----------
1.insert( iterator loc, size_type num, const TYPE &val)
----------
在指定位置loc前插入num个值为val的元素
插入2个C到vector中
输出是:CCABCD
*/
vector <char>::iterator it1 = letter.begin();
letter.insert( it1, 2, 'C');
for( it1 = letter.begin(); it1 != letter.end(); it1++ ) cout<<*it1;
cout<<endl;
/*
----------
2.iterator insert( iterator loc, const TYPE &val );
----------
在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
输出是:CCABCDH
*/
vector <char>::iterator it2 = letter.end()-1;
letter.insert( it2+1,'H');
for( it2 = letter.begin(); it2 != letter.end(); it2++ ) cout<<*it2;
cout<<endl;
/*
----------
3.void insert( iterator loc, input_iterator start, input_iterator end );
----------
在指定位置loc前插入区间[start, end)的所有元素
输出是:CBCDCABCDH
*/
vector <char>::iterator it3 = letter.begin();
letter.insert( it3+1,it3+3,it3+6);
for( it3 = letter.begin(); it3 != letter.end(); it3++ ) cout<<*it3;
return 0;
}
- vector之二维vector
#include<bits/stdc++.h>
using namespace std;
int main()
{
/*
int N=5,M=3
1.vector创建一个二维数组总是:
vector<vector<int>> array(N);
for (int i = 0; i < array.size(); i++)
array[i].resize(M);
2.方法2
N行,每行M个元素(一维数组),元素初始化=0
vector<vector<int> > array(N, vector<int>(M,0));
3.二维vector的遍历
需要定义的迭代器:
二维:vector<vector<int>>::iterator iter;
一维:vector<int>::iterator it;
还需要定义一个一维vector 来存储每一行
vector<int> vec_tmp;
4.基于3的输出:
for(iter = array.begin(); iter != array.end(); iter++)
{
vec_tmp = *iter;
for(it = vec_tmp.begin(); it !=vec_tmp.end(); it++)
cout << *it << " ";
cout << endl;
}
5.实现对二维的初始化:
for(i = 0; i < array.size(); i++)
{
for (j = 0; j < array[0].size();j++)
{
array[i][j] = (i+1)*(j+1);
}
}
*/
vector<vector<int> > array(5, vector<int>(3,0));//二维数组,5行3列
vector<int>::iterator it;//一维迭代器
vector<vector<int> >::iterator iter;//二维迭代器
vector<int> vec_tmp;//一维数组
for(iter=array.begin();iter!=array.end();iter++)
{
vec_tmp = *iter;
for(it = vec_tmp.begin();it !=vec_tmp.end();it++)
cout << *it << " ";
cout << endl;
}
}
- 结构体vector
题目:输入的n个人的名字,年龄。根据年龄进行升序排
知识点:
1. 运算符重载
2. vector+结构体(结构体数组)
3. sort()函数操作
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define Max 10000 //Max取无穷大
//S结构体的别名
struct S{
string name;
int age;
//运算符重载
/*
重载1:从大到小的降序排序
bool operator<(const S &other)const{
if(age<other.age)return false;
return true;
}
*/
//重载2:从小到大的升序排序
bool operator<(const S &other)const{
if(age<other.age)return true;
return false;
}
};
vector <S>::iterator it;
int main()
{
int n;
cin>>n;
vector <S> stu(n);//定义一个结构体数组 ,并且必须定义vector的大小
//先初始化了大小 可以用这种方法
for(it=stu.begin();it!=stu.end();it++)
{
cin>>(*it).name>>(*it).age;
}
//需求1.实现年龄的从小到大排序的输出
//不可以直接sort函数:sort(stu.begin(),stu.end());编译错误
//必须重载运算符后,再添加sort函数
sort(stu.begin(),stu.end());
//输出显示
//默认的输出:类似队列 先进先出
for(it=stu.begin();it!=stu.end();it++)
{
cout<<(*it).name<<":"<<(*it).age<<endl;
}
return 0;
}
- 结构体vector的另一种输入方式
#include<bits/stdc++.h>
using namespace std;
struct S{
string name;
int age;
};
int main()
{
int n;
cin>>n;
vector <S> stu;
for(int i=0;i<n;i++)
{
string name;
int age;
//输入方式
cin>>name>>age;
S s={name,age};
stu.push_back(s);
}
for (int i=0;i<n;i++)
{
cout<<stu[i].name<<":"<<stu[i].age<<endl;
}
}
- 当struct换成class(类)时,元素的写入方式:
//当时struct的时候
/*
struct S{
string name;
int age;
};
S s={name,age};
stu.push_back(s);
*/
----------
//当时class的时候
/*
class S{
public:
string name;
int age;
S(string _name,int _age):name(_name),age(_age){}
};
stu.push_back(S(name,age));
*/