定义
vector:向量(动态数组)是连续的空间,空间不够用的,会申请一个更大的连续的空间,同时迭代器失效
头文件
#include < vector >
Using namespace std;
定义向量的对象
1.可以为int,double,char
(本质和string一样)
void STLDefine( )
{
vector<int> vec;
}
2.可以为结构体
void STLDefine( )
{
struct STU
{
int age;
};
vector<struct STU> vec;
}
3.可以为指针
void STLDefine( )
{
vector<int*> vce;
}
4.可以放对象
- 普通类对象
- 其他容器的对象
void STLDefine( )
{
vector<string> vec; //相当于一个字符串数组
}
构造函数
- 无参数的构造
- n个元素
- 用num个val来初始化容器
- 用另一个vector对象初始化当前的vector对象
- 迭代器初始化
void STLConstructor( )
{
vector<int> vec; //无参数
vector<int> vec1(5); //5个元素,均初始化为0
vector<int> vec2(5,12); //5个元素,均初始化为12
vector<int> vec3(vec2); //用vec2对象初始化当前的vec3对象
//下面三行是用迭代器初始化的
vector<int>::iterator ite = vec2.begin();
vector<int>::iterator ite1 = vec2.end();
vector<int> vec4(ite,ite1);
属性
1.容量(重新分配容量后,迭代器失效
)
(1)
capacity( )
初始容量
:vs2005定义对象的时候初始化几个那么容量就是几,无参数就是0- 空间不够了,新空间的容量:容量不够时增加,增加现有容量的
一半
(e.g.:现有10个,新的就是15个;现有13个,新的就是19个) - vc6.0:容量不够增加时增加现有容量的
一倍
(e.g.:现有10个,新的就是20个)
void STLCapacity( )
{
vector<int> vec;
cout << vec.capacity() << endl;
}
(2)
reserve( )
- 修改容量,
不能变小,只能变大
- 设置多大就是多大
void STLCapacity( )
{
vector<int> vec;
vec.reserve(10); //容量从0变为10
}
2.大小
(1)
size( )
元素个数
void STLCapacity( )
{
vector<int> vec(6);
cout << vec.size() <<endl; //6个元素
}
(2)
resize( )
- 重新设置元素个数
容量不变
void STLCapacity( )
{
vector<int> vec(5);
vec.resize(4); //个数为4 容量为5
}
(3)
empty( )
对象是否有元素
- 空返回1
- 非空返回0
void STLCapacity( )
{
vector<int> vec;
vector<int> vec1(5,12);
cout << vec.empty() <<endl; //1
cout << vec1.empty() <<endle; //0
操作
1.增
加尾用push_back()
即可
加中间部分用insert
void STLAdd( )
{
vector<int> vec;
vector<int>vec1(5);
for(int i=0 ;i<10 ;i++)
{
vec.push_back(i);
}
vec.insert(vec,begin()+2,6); //将第3个位置改为 6
vec.insert(vec,begin()+1,6,15); //从第二个开始插6个15
vec1.insert(vec1.begin()+3,vec.begin(),vec.begin()+3);
// 从vec1的第四个位置上插入vec的第1个位置到第3个位置上的元素
2.删
- 尾删除
pop_back()
; - 删除指定元素 1.
iterator erase()
;删除一个 2.iterator erase( , );
删除一段
void STLDel( )
{
vector<int> vec;
for(int i=0 ;i<10 ;i++)
{
vec.push_back(i);
}
vec.pop_back(); //删最后一个
vec.erase(vec.begin()+5); //删第6个
vec.erase(vec.begin()+2,vec.end(); //删第3个到最后一个
}
3.改
利用输出形式修改
4.查
(1)输出全部
- 循环 1.迭代器 2.下标运算
- for_each( )
void fun(int i)
{
cout <**< i <<** endl;
}
void STLDD( )
{
vector<int> vec;
for(int i=0 ;i<10 ;i++)
{
vec.push_back(i);
}
for(int i=0 ;i<10 ;i++)
{
cout << vec[i] << endl; //循环:下标运算
}
vector<int>::iterator ite = vec.begin();
for(ite ;ite!=vec.end() ;ite++)
{
cout << *ite << endl; //循环:迭代器输出
}
for_each(vec.begin(), vec.end(), fun); //for_each()使用需加#include<algorithm>头文件
}
(2)输出单个元素
at( )
- [ ]下标输出
back( )
输出最后一个元素begin( )
输出第一个元素
void STLDD( )
{
vector<int> vec;
for(int i=0 ;i<10 ;i++)
{
vec.push_back(i);
}
cout << vec[5] << endl; //下标输出
for(int i=0 ;i<10 ;i++)
{
cout << vec.at(i) <<endl; //at()输出,at()函数遇到越界时可以抛出异常,使程序顺利进行
cout << vec.back() << endl; //输出最后一个元素
cout << vec.begin() << endl; //输出第一个元素
}
}
5.交换两个向量的内容
void STLSwap()
{
vecor<int> vec(5,6);
vector<in> ve1(5,12);
vec.swap(vec1);
}
运算符重载
- v1 == v2
- v1 != v2
- v1 <= v2
- v1 >= v2
- v1 < v2
- v1 > v2
void STLchong()
{
vector<int> vec(5,3);
vector<in> vec1(6,2);
cout << (vec>vec1) << endl; //满足括号内返回1 不满足返回0 比大小规则与字符串比大小类似
}
用两个算法
- 头文件
#include< algorithm >
- 遍历 for_each
- 排序
sort
void STLSuan( )
{
vecor<int> vec;
vec.push_back(2);
vec.push_back(1);
vec.push_back(4);
vec.push_back(3);
sort(vec.begin()+1 , vec.end()); //第二个到最后一个进行从小到大排序
sort( vec.begin()+1 , vec.end() , greate<int>() ); //从大到小排序,用greater需要加头文件#include<functional>