【问题标题】:What's the equivalent to Mathematica's Range[] function in C++?C++ 中 Mathematica 的 Range[] 函数等价于什么?
【发布时间】:2012-12-17 03:39:18
【问题描述】:

Mathematica 有一个名为 Range[] 的函数,它执行以下操作:

Range[0, 10]
Range[-10, 0]

它打印的蚂蚁:

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0}

C++有这样的功能吗?

【问题讨论】:

  • 裸 C++?没有。第三方库?是的。
  • 使用纯 C++ 我只能通过声明一个函数来实现,对吧?
  • 更好的是,按照给出的答案。它们经过更多测试,通常比洁净室功能或类更安全。
  • std::iota 在这里工作得很好。
  • @chris Mentioning std::iota 会是一个很好的答案!

标签: c++


【解决方案1】:

标准库中没有,但来自boost::range

#include <iostream>
#include <iterator>
#include <boost/range/irange.hpp>
#include <boost/range/algorithm/copy.hpp>

int main()
{
    boost::copy(boost::irange(0, 11), 
                std::ostream_iterator<int>(std::cout, " "));
}

输出: 0 1 2 3 4 5 6 7 8 9 10

【讨论】:

    【解决方案2】:

    创建一个似乎很容易。

    std::vector<int> range(int from, int to) {
        std::vector<int> result;
        result.reserve(to-from+1);
        for (int i = from; i <= to; ++i) {
            result.push_back(i);
        }
        return result;
    }
    

    【讨论】:

    • 这不适用于问题的第二种情况,我相信你知道,但我想也许其他人不会。
    • @Ben:当然会。是什么让你认为它不会?
    • 糟糕,我将第二种情况读作 [0 -10] 你是完全正确的。我很抱歉。
    【解决方案3】:

    为了完整起见,以下是使用 C++11 标准库和 lambdas 的方法:

    vector<int> v;
    int counter = -3;    // The initial value
    generate_n(
        back_inserter(v) // Where to insert
    ,   10               // how many items
    ,   [&counter] () -> int { return counter++; });
    

    这是link to ideone with a demo

    【讨论】:

      【解决方案4】:

      只有两个库提供 lazyO(1) 内存数值范围:

      使用SCC (C++ REPL) 和 RO:

      scc 'range(0,10)'
      {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
      
      scc 'range(-10,0)'
      {-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-09
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多