一,向量
vector:向量(动态数组)内存分配是连续的空间,空间不够用会申请一个更大的连续的空间,同时迭代器失效。
二,头文件
#include <vector> //头文件
#include <iostream>
using namespace std;
三,定义向量的对象
以int类型为例
void STLDefine()
{
vector<int> vec; //定义向量的对象
}
定义的对象还可以是结构体
void STLDefine()
{
struct stu
{
int age;
};
vector<stu> vec; //定义向量的对象
}
定义的对象还可以是double型,指针等
vector< char > vec;相当于string
四,构造函数
void STLConstructor() //构造函数
{
vector<int> vec; //无参数的构造
vector<int> vec1(5); //五位有效元素,初始值为0
vector<int> vec2(5,12); //将5个数赋值为12
vector<int> vec3(vec2);
vector<int>::iterator ite = vec2.begin();
vector<int>::iterator ite1 = vec2.end();
vector<int> vec4(ite,ite1);
/*测试
cout << vec[0]; 由于没有元素,测试会崩溃
for(int i = 0; i < 5; i++)
cout << vec1[i] << endl;
for(int i = 0; i < 5; i++)
cout << vec2[i] << endl;
for(int i = 0; i < 5; i++)
cout << vec3[i] << endl;
for(int i = 0; i < 5; i++)
cout << vec4[i] << endl; */
}
五,容量
(1)capacity()
- 初始容量:定义对象的时候初始化几个,容量就是几。无参数就是0。
- 空间不够用,新的空间容量:增加现有容量的一半,如果现有容量为10,新的容量就是15,如果现有容量是13,新的容量就是19。
- 注意:在vc6.0编译器中,容量不够时,增加为现有容量的二倍。如果现有容量为10,新的容量就是20,如果现有容量是20,新的容量就是40。
(2)reserve();
- 修改容量:只能变大,不能变小
vector<int> vec;
vec.reserve(10); //容量由0变为10
- 设置多大就是多大
(3)重新分配容量后,迭代器失效
六,大小
(1)size(): 有效元素的个数
vector<int> vec(4);
cout << vec.size() << endl; //输出为4
(2)resize() : 重新设置元素个数,容量不变
vector<int> vec(4);
vec.resize(3);
cout << vec.size() << endl;
cout << vec.capacity() << endl;//输出3 \n 4
(3)empty(): 判断对象是否有元素
如果是空返回 1,如果有元素返回 0 。
vector<int> vec;
cout << vec.empty(); //输出 1
vector<int> vec(4);
cout << vec.empty(); //输出 0
七,操作
(1)查
- 利用for循环以及下标运算输出
void STLDO()
{
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;//还可以写成cout << vec.at(i) << endl;(这种更安全)
}
}
- 利用for循环以及迭代器输出
vector<int>::iterator ite = vec.begin();
for(ite; ite != vec.end(); ite ++)
{
cout << *ite << endl;
}
- 输出单个元素
at() :返回单个元素
back() : 返回尾巴元素
begin() : 返回头元素
cout << vec.at();
cout << vec.back();
cout << vec.begin();
- 用for_each输出
#include <algorithm>//需要加这个头文件
void fun(int i)
{
cout << i <<endl;
}
for_each(vec.begin,vec.end(),fun);
(2)增
- 尾添加 : void push_back();
- 中间添加 : insert
void fun(int i)
{
cout << i <<endl;
}
void STLADD()
{
vector<int> vec;
for(int i = 0; i < 10; i++)
{
vec.push_back(i);
}
vec.insert(vec.begin()+2,12);//在指定迭代器的位置加入一个数据
vec.insert(vec.begin()+2,5,12);//在某个迭代器后加sum个值为value的元素
vector<int> vec1(5,1);
vec.insert(vec.begin()+3,vec1.begin(),vec1.begin()+3);//在某个迭代器后加入另一个向量的中间一段
for_each(vec.begin,vec.end(),fun);
}
(3)删
- 尾删除 :void pop_back();
- 删除指定元素 : erase
vec.erase(vec.begin()+3);//删除一个
vec.erase(vec.begin()+3,vec.end());//删除一段
(4)改
- 利用输出形式修改
(5)交换两个向量的内容
- 用swap函数进行交换
vec.swap(vec1);
八,两个算法
(1)遍历:for_each
(2)排序 :sort
- 从小到大
vector<int> vec;
vec.push_back(2);
vec.push_back(1);
vec.push_back(4);
vec.push_back(5);
vec.push_back(3);
sort(vec.begin()+2,vec.end());//可以不从头到尾排
for_each(vec.begin(),vec.end(),fun);
- 从大到小
sort(vec.begin(),vec.end(),greater<int>());
注意:在使用greater函数时需要加头文件
#include < functional >
只有多多应用才能熟练掌握,加油。