c++给容器赋值实现批量赋值的算法

说明:下列算法如果没有特殊说明,则来自algorithm头文件,对容器批量进行赋值的算法:

  • std::generate

  • 将gen函数的返回值挨个赋值给[first,last)范围内的容器。等价于:
  • template <class ForwardIterator, class Generator>
    void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
    {
        while (first != last) 
        {
            *first = gen();
            ++first;
        }
    }
    • 参数说明
      first,last:分别指的是前向迭代器(forward iterators)的范围。
      gen:表示生成函数,可以是函数指针,也可以是函数体,一般可用lambda函数代替。

    • 示例

    std::vector<int> myvector(8);
    auto randFunc = []()->int {std::rand() % 100; };      // lambda function
    std::generate (myvector.begin(),  myvector.end(), RandomNumber); // generate function
    copy (myvector.begin(), myvector.end(), std::ostream_iterator<int>(cout, "")); // output

    • std::generate_n

  • 该函数给从指定位置开始往后的n个数(包括该位置),使用gen函数的结果赋值。等价于:
  • template <class ForwardIterator, class Generator>
    void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
    {
        while (first != last) 
        {
            *first = gen();
            ++first;
        }
    }
    • 参数说明
      first:开始赋值的起始位置。
      n:n值表示赋值的个数,其中first参数指向的值为第1个数,first后面的是第2个数,以此类推。如果是负数,则generate_n不会进行赋值。
      gen:赋值的产生函数

    • 示例

    int my_array[9];
    int first = 1;
    auto f = [&first]()->int {return first++; };
    std::generate_n (my_array, 10, f);
    copy (std::begin(my_array), std::end(my_array), std::ostream_iterator<int>(cout, " "));// output

    • std::fill

  • 该函数用固定的值给容器中全部元素赋值。等价于:
  • template <class ForwardIterator, class T>
    void fill (ForwardIterator first, ForwardIterator last, const T& val)
        {
            while (first != last)
            {
                *first = val;
                ++first;
            }
        }
    • 参数说明
      first,last:起始位置和结束位置,其中last指向的位置不会被赋值。
      val:要赋的值。

    • 示例

    std::vector<int> myvector (8);    // myvector: 0 0 0 0 0 0 0 0
    std::fill (myvector.begin(),myvector.begin()+4,5); // myvector: 5 5 5 5 0 0 0 0
    std::fill (myvector.begin()+3,myvector.end()-2,8); // myvector: 5 5 5 8 8 8 0 0
    copy (std::begin(myvector), std::end(myvector), std::ostream_iterator<int>(cout, " "));// output

    • std::fill_n

  • 该函数赋值从指定位置开始往后的n个数(包括该位置)赋值,使用固定值赋值。等价于:
  • template <class OutputIterator, class Size, class T>
    OutputIterator fill_n (OutputIterator first, Size n, const T& val)
    {
        while (n>0) 
        {
            *first = val;
            ++first;
             --n;
        }
        return first;     // since C++11
    }
    • 参数说明
      first:起始位置。
      n:表示包括起始位置后的多少个数。
      val:要赋予容器中这些范围中元素的值。

    • 示例

    std::vector<int> myvector (8,10);     // myvector: 10 10 10 10 10 10 10 10
    std::fill_n (myvector.begin(),4,20);   // myvector: 20 20 20 20 10 10 10 10
    std::fill_n (myvector.begin()+3,3,33);  // myvector: 20 20 20 33 33 33 10 10
    copy (std::begin(myvector), std::end(myvector), std::ostream_iterator<int>(cout, " "));// output

    • std::iota

  • 该函数来自于头文件numeric中,该函数可以使用连续递增值初始化一个数组容器。等价于:
  • template <class ForwardIterator, class T>
    void fill (ForwardIterator first, ForwardIterator last, const T& val)
    {
        while (first != last)
        {
            *first = val;
            ++val;
            ++first;
        }
    }

  • 参数说明

  • first,last:表示要赋值的范围,不会对last指向的位置赋值。
    val:起始第一个元素的赋值.

  • 示例
  • int my_array[9];
    std::iota (std::begin(my_array), std::end(my_array), 10);
    std::iota (my_array, my_array+9, 10);
    copy (std::begin(my_array), std::end(my_array), std::ostream_iterator<int> (cout, " "));
    • 总结
    • generate 和generate_n 对指定范围内的元素赋值,赋值采用gen函数的返回值,需要根据设计gen函数。
    • fill 和 fill_n 用以对指定范围内的元素赋予固定值。
    • iota用以对指定范围内元素赋予从指定元素起的序列值,该序列值赋值完后会自增。
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值