2015-02-11 126 views
5

我已經習慣使用Python或Matlab在那裏我可以創建這樣一個列表:如何快速用C創建陣列++

min = 5; 
step = 2; 
max = 16; 
Range = min:step:max; 

和範圍將是列表[5,7,9,11, 13,15]。

有沒有一種簡單的方法在C++中生成類似「Range」的列表?到目前爲止,我能想到的最簡單的事情就是使用for循環,但這相當乏味。

+0

所以,把它放在一個函數。 – 2015-02-11 06:32:57

+0

那麼,如果你問我(我從來沒有想過)for循環是個不錯的主意。 – 2015-02-11 06:34:49

+0

[關於C++中的列表理解](http://dev-perspective.blogspot.com/2012/10/on-list-comprehension-in-c.html) – philipxy 2015-02-11 07:08:33

回答

2

你必須實現一個自己,是這樣的:

std::vector<int> createArray(int min, int max, int step) 
{ 
    std::vector<int> array; 
    for(int i = min; i < max; i += step) 
    { 
     array.push_back(i); 
    } 
    return array; 
} 
5

C++不提供這樣的事情,無論是在語言或標準庫。我會寫一個函數模板看(大約)就像從標準庫的東西,這個東西順序:

namespace stdx { 
    template <class FwdIt, class T> 
    void iota_n(FwdIt b, size_t count, T val = T(), T step = T(1)) { 
     for (; count; --count, ++b, val += step) 
      *b = val; 
    } 
} 

從那裏它會是這個樣子:

std::vector<int> numbers; 
stdx::iota_n(std::back_inserter(numbers), 6, 5, 2); 
1

沒有這種預定義方法在C++中用於此目的。以下代碼可能對您有所幫助。

std::vector<int> createArrayRange(int min, int max, int step) 
{ 
    std::vector<int> array; 
    for(int i = min; i < max; i += step) 
    { 
     array.push_back(i); 
    } 
    return array 
} 

或者這會比較快。

void createArrayRange(std::vector<int>& array, int min, int max, int step) 
{ 
    for(int i = min; i < max; i += step) 
    { 
     array.push_back(i); 
    } 
} 

int main() 
{ 
    std::vector<int> array; 
    createArrayRange(array, min, max, step); 

    return 0; 
} 
1

您可以使用std::generate這個。

std::vector<int> createArray(int min, int max, int step) 
{ 
    std::vector<int> array((max-min)/step); 
    int n = min; 
    std::generate(array.begin(), array.end(), 
    [&]() 
    { 
     int res = n; 
     n+=step; 
     return res; 
    }); 
    return array; 
} 
0

無需顯式循環:

vector<int> data(6,2); 
data[0] = 5; 
std::partial_sum(data.begin(),data.end(),data.begin());