簡體   English   中英

生成從0到n-1的數字的慣用方式是什么?

[英]What's the idiomatic way to generate the numbers from 0 to n-1?

在數組或向量中以任意類型生成從0到n-1的數字的可接受的C ++慣用法是什么?

換句話說,我該怎么寫:

template <typename T> vector<T> generate_integers_upto(size_t n);

要么

template <typename T> T* generate_integers_upto(size_t n);

慣用的方法是按值返回。 為了簡單起見,您可以使用std::iota填充矢量,但這是次要的:

#include <vector>
#include <numeric>

template<typename T>
std::vector<T> generate(std::size_t n)
{
  std::vector<T> v(n);
  std::iota(std::begin(v), std::end(v), T());
  return v;
}

只需按值返回,然后讓編譯器決定哪種方法(RVO,移動返回等)更有效:

template<typename T>
std::vector<T> generate( std::size_t n , T begin = 0u )
{
    std::vector<T> result( n );

    std::iota( std::begin( result ) , std::end( result ) , begin );

    return result;
}

請注意,默認返回類型為unsigned int 當然,您可以更改傳遞給函數的值以更改返回值,或顯式指定返回類型:

int main()
{
    auto sequence = generate<float>( 100 );
}

此實現基於std::iota()標准庫算法。

而是取決於您要如何處理這些數字。

如果您真的想要一個范圍,而不是一個容器,那么boost::irange就足夠了。 它甚至不需要任何[大量]內存!

可以讓您做一些很酷的事情

#include <iostream>
#include <boost/range/irange.hpp>

using boost::irange;
using std::cout;

int main()
{
    for (auto i : irange(0, 42))
        cout << i << ' ';
}

// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

如果要讓函數為您創建數組,請按值返回std::vector

如您的第一個示例所示,返回引用要么無效(如果向量是現在已銷毀的局部變量),要么是奇怪且容易出錯的(因為現在某個地方需要某種方式管理向量)。

返回指針(大概是分配的數組)很容易出錯,因為沒有任何東西可以確保調用者正確地分配它。

更為靈活的替代方法是采用迭代器范圍。 對於兩個迭代器都可以重載它:

std::vector<int> v(10);       // non-empty vector
generate(v.begin(), v.end()); // replace existing elements

以及迭代器和大小:

std::vector<int> v;             // empty vector
generate(back_inserter(v), 10); // insert new elements

請注意,C ++ 11庫具有一個std::iota ,其行為類似於第一個版本(可用於實現其中任何一個),但與第二個版本完全不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM