数据结构与函数使用3:iota函数使用

文章介绍了C++11中的iota函数,用于向指定容器填充增值序列,详细解释了其工作原理和使用方法,包括与sort函数配合进行排序的场景。示例代码展示了如何使用iota重置vector内容,并讨论了其优缺点,如简化排序但引入额外空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文目的

简单的介绍一下iota函数是什么,有什么用,在写算法面试题的时候如何使用

前置知识点

  1. 迭代器
  2. vector
  3. STL算法库
  4. 类与模板
  5. 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 怎么用

  1. 这个时候可以先用iota函数生成序列,此时序列里面存的值指向姓名和分数,有点类似构造了一个结构体。
  2. 对iota按照分数进行排序
  3. 最后就从这个数组按序遍历,数组里的号指向姓名和分数数组的对应位置

3.3 优缺点分析

  • 优点:非常简单,不需要额外针对这种类型的数据编写一个完整的排序法则
  • 缺点:额外o(n)的空间复杂度

参考文献

《C++标准库 自修教程与参考手册》9.1 算法头文件 p321

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值