数据结构与函数使用3:iota函数使用
本文目的
简单的介绍一下iota函数是什么,有什么用,在写算法面试题的时候如何使用
前置知识点
- 迭代器
- vector
- STL算法库
- 类与模板
- C++基本语法基础
iota()函数简介
c++11新增的函数,向指定容器范围填充一连串增值序列
本质上就是按序访问迭代器,同时value++的写法
算法原理
本质上就是按序访问迭代器,同时value++的写法,没什么难的
STL实现代码如下
/**
* @brief Create a range of sequentially increasing values.
*
* For each element in the range @p [first,last) assigns @p value and
* increments @p value as if by @p ++value.
*
* @param __first Start of range.
* @param __last End of range.
* @param __value Starting value.
* @return Nothing.
*/
template<typename _ForwardIterator, typename _Tp>
void
iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
{
// concept requirements
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator>)
__glibcxx_function_requires(_ConvertibleConcept<_Tp,
typename iterator_traits<_ForwardIterator>::value_type>)
__glibcxx_requires_valid_range(__first, __last);
for (; __first != __last; ++__first)
{
*__first = __value;
++__value;
}
}
iota函数的使用
1. 头文件定义
#include<numeric>
相关内容参考《C++标准库 自修教程与参考手册》9.1 算法头文件 p321
C++标准程序库的算法需要导入头文件<algorithm>
一些数值类算法函数需要导入<numeric>
2. 函数使用
2.1 相关模板定义
查看头文件里面的iota()函数定义是这样的,使用了模板(会自动识别元素内容)
template<typename _ForwardIterator, typename _Tp>
void iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value);
模板的定义参数如下
- 模板参数1:_ForwardIterator,前向迭代器的类型
- 模板参数2:_TP,初始值类型
函数的形参如下
- 参数1:__first,前向迭代器头部
- 参数2:__last,前向迭代器尾部
- 参数2:__value,初始值
2.2 使用iota函数进行容器赋值
这里使用了vector<int>对其内容进行赋值,初始值设置为0
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int main(int argc, char *argv[])
{
int len = 10;
vector<int> nums(10,0);
cout<<"iota重新赋值前:";
for(auto num:nums)
cout<<num<<' ';
cout<<'\n';
cout<<"iota重新赋值后:";
iota(nums.begin(),nums.end(),0);
for(auto num:nums)
cout<<num<<' ';
return 0;
}
程序输出如下
iota重新赋值前:0 0 0 0 0 0 0 0 0 0
iota重新赋值后:0 1 2 3 4 5 6 7 8 9
3. 配合sort函数操作
3.1 什么时候用
有时候配合sort函数非常好用,多数组同时排序(比如说期末考试,按照分数排名的时候,排分数人名要跟着一起动)。
3.2 怎么用
- 这个时候可以先用iota函数生成序列,此时序列里面存的值指向姓名和分数,有点类似构造了一个结构体。
- 对iota按照分数进行排序
- 最后就从这个数组按序遍历,数组里的号指向姓名和分数数组的对应位置
3.3 优缺点分析
- 优点:非常简单,不需要额外针对这种类型的数据编写一个完整的排序法则
- 缺点:额外o(n)的空间复杂度
参考文献
《C++标准库 自修教程与参考手册》9.1 算法头文件 p321