我已經習慣使用Python或Matlab在那裏我可以創建這樣一個列表:如何快速用C創建陣列++
min = 5;
step = 2;
max = 16;
Range = min:step:max;
和範圍將是列表[5,7,9,11, 13,15]。
有沒有一種簡單的方法在C++中生成類似「Range」的列表?到目前爲止,我能想到的最簡單的事情就是使用for循環,但這相當乏味。
我已經習慣使用Python或Matlab在那裏我可以創建這樣一個列表:如何快速用C創建陣列++
min = 5;
step = 2;
max = 16;
Range = min:step:max;
和範圍將是列表[5,7,9,11, 13,15]。
有沒有一種簡單的方法在C++中生成類似「Range」的列表?到目前爲止,我能想到的最簡單的事情就是使用for循環,但這相當乏味。
你必須實現一個自己,是這樣的:
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;
}
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);
沒有這種預定義方法在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;
}
您可以使用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;
}
無需顯式循環:
vector<int> data(6,2);
data[0] = 5;
std::partial_sum(data.begin(),data.end(),data.begin());
所以,把它放在一個函數。 – 2015-02-11 06:32:57
那麼,如果你問我(我從來沒有想過)for循環是個不錯的主意。 – 2015-02-11 06:34:49
[關於C++中的列表理解](http://dev-perspective.blogspot.com/2012/10/on-list-comprehension-in-c.html) – philipxy 2015-02-11 07:08:33