std::vector
: 动态连续数组(dynamic contiguous array)
头文件 :#include <vector>
迭代器类型:随机访问迭代器
总结
1.构造函数
//构造函数
vector<int> v1();//空构造
vector<int> v2(10,7);//n个元素构造,10个7
vector<int> v3(v2.begin(),v2.begin()+5);//区间构造
vector<int> v4(v3);//拷贝构造
//PS.用{}初始化
vector<int> v5{1,2,3,4};
vector<int> v6 = {6,7,8,9};
2.成员函数
(1)//operator =
vector<T> v2 = v1;//将v1的值拷贝到v2中
(2)//assign
v1.assign(4,5);//赋值,4个5
v2.assign(v1.begin(),v1.begin()+2);//区间赋值
(3)//Element access
v.at(1);//取下标为1的元素,越界会抛异常
v[2];//取下标为2的元素,越界不会抛异常
v.front();//头元素
v.back();//尾元素
(4)//Iterators
v.begin();//起始迭代器
v.end();//终止迭代器
v.rbegin();//反向起始迭代器
v.rend();//反向终止迭代器
(5)//Capacity
v.reserve(10);//预留空间,10个
v.empty();//判断是否为空
v.size();//元素个数
v.capacity();//总容量
v.max_size();//最大可能容纳的元素个数
(6)//Modifiers
v.clear();//清空
v.insert(v.begin(),10);//在v.begin()位置插入10
v.insert(v.end(),v_temp.begin(),v_temp.end());//在v.end()位置插入一个区间的元素
v.emplace(v.begin()+2,20);//在v.begin()+2位置插入20
v.push_back(30);//在尾部插入30
v.emplace_back(40);//在尾部插入40
v.pop_back();//将尾部元素删除
v.erase(v.begin()+1);//删除在v.begin()+1位置的元素
v.erase(v.begin(),v.begin()+3);//删除指定区间内的元素
v.resize(10);//重置v的size为10。若小于原size,舍弃多出来的元素;若大于原size,多出的位置补0.
v.swap(v_temp);//交换两个同类型vector的元素
3. 非成员函数
v1 == v2;//判断两个vector容器是否相等
v1 != v2;//判断是否不相等
4.常用算法
头文件:#include <algorithm>
(1)//Non-modifying sequence operations
all_of(v.begin(),v.end(),_Pred);//全部元素符合条件否?
any_of(v.begin(),v.end(),_Pred);//任一元素符合条件否?
none_of(v.begin(),v.end(),_Pred);//无元素符合条件否?
count(v.begin(),v.end(),elem);//元素elem出现的次数
count_if(v.begin(),v.end(),_Pred);//符合条件的元素个数
for_each(v.begin(),v.end(),_Func);//遍历,并可以对每个元素操作
find(v.begin(),v.end(),elem);//查找元素elem第一次出现位置,返回其迭代器
find_if(v.begin(),v.end(),_Pred);//查找符合条件的元素elem第一次出现位置,返回其迭代器
find_if_not(v.begin(),v.end(),_Pred);//查找不符合条件的元素elem第一次出现位置,返回其迭代器
(2)//Modifying sequence operations
copy(v.begin(),v.end()-1,inserter(v_c_dest,v_c_dest.begin())); //拷贝,将v的指定区间内的元素,通过插值迭代器拷贝到v_c_dest的begin()位置
fill(v.begin(),v.end()-5,elem);//将指定区间填充为elem
transform(v.begin(),v.end()-3,inserter(v_t_dest,v_t_dest.begin()),_Func);//搬运,将v的指定区间内的元素,通过插值迭代器搬运到v_t_dest的begin()位置,且可对每个元素操作
swap(v,v_t_dest);//交换两个vector的所有元素
reverse(v.begin(),v.end());//反转元素顺序
random_shuffle(v.begin(),v.end());//随机洗牌,打乱元素顺序,配合srand()使用
(3)//Sorting operations
is_sorted(v.begin(),v.end());//判断是否按升序排好
sort(v.begin(),v.end());//排序,默认升序
sort(v.begin(),v.end(),_Pred);//指定规则排序,一般自定义数据排序需要重载operator < 或 operator >
(4)//Set operations (on sorted ranges)
set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_inter,v_inter.begin()));//求v1和v2的交集,使用插值迭代器将结果放在v_inter中
set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_union,v_union.begin()));//求v1和v2的并集,使用插值迭代器将结果放在v_union中
set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_diff,v_diff.begin()));//求差集,v1 - v2,使用插值迭代器将结果放在v_diff中
includes(v1.begin(),v1.end(),v_inter.begin(),v_inter.end());//判断v_inter是否为v1的子集
(5)//Other operations on sorted ranges
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_merge,v_merge.begin()));//合并两个容器,使用插值迭代器将结果放入v_merge中
模型
图示:
解释:
v 是一个装有int
型数据的vector
容器。
其全部元素为:10,20,30,40,50.
v.front() == 10;
v.back() == 50;
其迭代器v.begin()指向头元素10的地址,其迭代器v.end()指向尾元素50的下一个(虽然没有)元素地址,故
*v.begin() == 10;
*(v.end() - 1) == 50;
其反向迭代器v.rbegin()指向元素50的地址,其反向迭代器v.rend()指向元素10的下一个(虽然没有)元素地址,故
*v.rbegin() == 50;
*(v.rend() - 1) == 10;
其正向迭代器和反向迭代器都重载了 ++
--
<
>
==
+
-
等操作符,故
*v.begin()++ == 20;
*(v.end() - 2) == 40;
v.begin() < v.end() == true;
v.rend() - v.rbegin() == 5;
但是不同类型迭代器不能这么操作
v.rend() - v.begin();//error
对于同类型迭代器 +
没有意义
v.begin() + v.end();//error
实例
1.构造函数
void test01()
{
//构造函数
vector<int> v1();//空构造
vector<int> v2(10,7);//n个元素构造,10个7
vector<int> v3(v2.begin(),v2.begin()+5);//区间构造
vector<int> v4(v3);//拷贝构造
printVectorInt(v2);
printVectorInt(v3);
printVectorInt(v4);
}
2.成员函数
(1)operator =
void test02()
{
//operator =
vector<int> v1(4,6);
vector<int> v2 = v1;
printVectorInt(v2);
}
(2)assign
assign() //赋值
void test03()
{
//assign
vector<int> v1;
v1.assign(5,5);//给v1赋5个5
vector<int> v2;
v2.assign(v1.begin(),v1.begin()+2);//给v2赋一个左闭右开区间的值
printVectorInt(v1);
printVectorInt(v2);
}
(3)Element access
at() //取指定位置的元素
operator [] //取指定位置的元素
front() //取头元素
back() //取尾元素
void test04()
{
//Element access
vector<int> v = {1,2,3,4};
cout<<"v.at(1) = "<<v.at(1)<<endl;
cout<<"v[2] = "<<v[2]<<endl;
cout<<"v.front() = "<<v.front()<<endl;
cout<<"v.back() = "<<v.back()<<endl;
}
(4)Iterators
begin() //起始迭代器
end() //终止迭代器
rbegin() //反向起始迭代器
rend() //反向终止迭代器
void test05()
{
//Iterators
vector<int> v = {1,2,3,4};
vector<int>::iterator begin_it = v.begin();
vector<int>::iterator end_it = v.end();
vector<int>::reverse_iterator rbegin_it = v.rbegin();
vector<int>::reverse_iterator rend_it = v.rend();
cout<<"*begin_it = "<<*begin_it<<endl;
cout<<"*(end_it - 2) = "<<*(end_it - 2)<<endl;
cout<<"*rbegin_it = "<<*rbegin_it<<endl;
cout<<"*(rend_it - 1) = "<<*(rend_it - 1)<<endl;
}
(5)Capacity
reserve() //预留空间
empty() //判断是否为空
size() //元素个数
capacity() //容量
max_size() //最大可能容纳的元素个数
void test06()
{
//Capacity
vector<int> v = {1,2,3,4};
v.reserve(10);
cout<<"v.empty() = "<<v.empty()<<endl;
cout<<"v.size() = "<<v.size()<<endl;
cout<<"v.capacity() = "<<v.capacity()<<endl;
cout<<"v.max_size() = "<<v.max_size()<<endl;
}
(6)Modifiers
clear() //清空容器
insert() //指定位置插入元素
emplace() //指定位置插入元素
push_back() //尾部插入元素
emplace_back() //尾部插入元素
pop_back() //尾部删除元素
erase() //删除指定位置的元素
resize() //重置元素个数
swap() //和另一容器交换所有元素
void test07()
{
//Modifiers
vector<int> v = {1,2,3,4};
printVectorInt(v);//原始数据
v.clear();
v.insert(v.begin(),10);
v.emplace(v.begin(),20);
v.push_back(30);
v.emplace_back(40);
printVectorInt(v);
v.pop_back();
v.erase(v.begin()+1);
printVectorInt(v);
cout<<"v.size() = "<<v.size()<<endl;
v.resize(10);
cout<<"v.size() = "<<v.size()<<endl;
printVectorInt(v);
vector<int> v_temp = {1,2,3,4,5};
v.swap(v_temp);
printVectorInt(v);
}
3.非成员函数
(1)operator== & operator !=
void test08()
{
vector<int> v1 = {1,2,3,4};
vector<int> v2 = {1,2,3,4};
vector<int> v3 = {1,2,3};
cout<<(v1 == v2)<<endl;//1
cout<<(v1 != v3)<<endl;//1
}
4.常用算法
头文件:#include <algorithm>
(1)Non-modifying sequence operations
all_of() & any_of() & none_of() //条件符合判断
count() & count_if() //计数
for_each() //遍历
find() //查找
void test09()
{
vector<int> v = {6,3,2,4,9,5,6,9,8};
printVectorInt(v);//原始数据
//条件符合
cout<<"是否全都是正数 :"<<all_of(v.begin(),v.end(),[](int val){return val > 0;})<<endl;
cout<<"是否存在大于10的数 :"<<any_of(v.begin(),v.end(),[](int val){return val > 10;})<<endl;
cout<<"是否连一个7都不存在:"<<none_of(v.begin(),v.end(),[](int val){return val == 7;})<<endl;
//计数
cout<<"9 出现次数 :"<<count(v.begin(),v.end(),9)<<endl;;
cout<<"大于3的元素个数为 :"<<count_if(v.begin(),v.end(),[](int val){return val > 3;})<<endl;
//遍历,可对每一个元素进行操作
for_each(v.begin(),v.end(),[](int val){cout<<val+10<<ends;});
cout<<endl;
//查找
auto iter = find(v.begin(),v.end(),9);
cout<<"找到第一个9的下一个元素为:"<<*(iter+1)<<endl;
}
(2)Modifying sequence operations
copy() //拷贝
fill() //填充
transform() //搬运
swap() //交换
reverse() //反转
random_shuffle() //随机洗牌,打乱元素顺序
#include <iterator>
#include <time.h>
void test10()
{
vector<int> v = {1,2,3,4,5,6,7,8};
cout<<"v :";
printVectorInt(v);//原始数据
vector<int> v_c_dest;
copy(v.begin(),v.end()-1,inserter(v_c_dest,v_c_dest.begin()));
cout<<"v_c_dest:";
printVectorInt(v_c_dest);
fill(v.begin(),v.end()-5,10);
cout<<"v :";
printVectorInt(v);
vector<int> v_t_dest;
transform(v.begin(),v.end()-3,inserter(v_t_dest,v_t_dest.begin()),[&](int val){return val+10;});
cout<<"v_t_dest:";
printVectorInt(v_t_dest);
swap(v,v_t_dest);
cout<<"v :";
printVectorInt(v);
reverse(v.begin(),v.end());
cout<<"v :";
printVectorInt(v);
srand(time(nullptr));
random_shuffle(v.begin(),v.end());
cout<<"v :";
printVectorInt(v);
}
(3)Sorting operations
is_sorted() //判断是否已按升序排列好
sort() //排序,默认为升序
#include <functional>
void test11()
{
vector<int> v = {4,2,1,4,3,6,2,8};
printVectorInt(v);
cout<<"v是否按升序排列好了:"<<is_sorted(v.begin(),v.end())<<endl;
//使用内建函数对象,指定排序规则为降序排列
sort(v.begin(),v.end(),greater<int>());
printVectorInt(v);
cout<<"v是否按升序排列好了:"<<is_sorted(v.begin(),v.end())<<endl;
//默认规则为升序
sort(v.begin(),v.end());
printVectorInt(v);
cout<<"v是否按升序排列好了:"<<is_sorted(v.begin(),v.end())<<endl;
}
(4)Set operations (on sorted ranges)
set_intersection() //交集
set_union() //并集
set_difference() //差集
includes() //判断是否为子集
void test12()
{
//两容器内元素必须有序
vector<int> v1{1,3,5,7,7,7};
vector<int> v2 = {2,4,6,7,7};
vector<int> v_inter;//交集
vector<int> v_union;//并集
vector<int> v_diff;//差集
//求交集
set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_inter,v_inter.begin()));
printVectorInt(v_inter);
//求并集
set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_union,v_union.begin()));
printVectorInt(v_union);
//求差集,v1 - v2
set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_diff,v_diff.begin()));
printVectorInt(v_diff);
//判断v_inter是否为v1的子集
cout<<"v1是否包含全部v_inter : "<<includes(v1.begin(),v1.end(),v_inter.begin(),v_inter.end())<<endl;
}
(5)Other operations on sorted ranges
merge() //合并
void test13()
{
//两容器内元素必须有序
vector<int> v1{1,3,5,7,7,7};
vector<int> v2 = {2,4,6,7,7};
vector<int> v_merge;
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_merge,v_merge.begin()));
printVectorInt(v_merge);
}
参考资料:
链接: std::vector.