C ++ Как вставить последовательный интервал в std :: vector? - PullRequest
0 голосов
/ 16 мая 2018

Скажем, я хочу, чтобы все числа от 23 до 57 были в vector.Я могу сделать это:

vector<int> result;
for (int i = 23; i <= 57; ++i)
{
    result.push_back(i);
}

Но это 5-строчное решение для простой работы.Разве я не могу сделать это более элегантно?Наилучшим синтаксисом будет, например, vector<int> result{23 .. 57}; или такой простой тривиальный код.Любые варианты с C ++ 17?

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

При range-v3 это будет:

const std::vector<int> result = ranges::view::ints(23, 58); // upper bound is exclusive
0 голосов
/ 16 мая 2018

Еще одна возможность - использовать boost::counting_iterator [1]. Это также имеет преимущество работы с C ++ 98, если вам не повезло, что вы застряли с ним.

#include <boost/iterator/counting_iterator.hpp>

...

result.insert(result.end(), boost::counting_iterator<int>(23), boost::counting_iterator<int>(58));

или, еще проще:

vector<int> result(boost::counting_iterator<int>(23), boost::counting_iterator<int>(58));

Обратите внимание, что, поскольку в любом случае ожидается нормальный полуоткрытый диапазон, вам придется использовать lastNum+1, и по этой причине вы не сможете вставить numeric_limits<int>::max() (он же INT_MAX).

[1] https://www.boost.org/doc/libs/1_67_0/libs/iterator/doc/counting_iterator.html

0 голосов
/ 16 мая 2018

Вы можете использовать std::iota (начиная с C ++ 11).

Заполняет диапазон [первый, последний) последовательно увеличивающимися значениями, начиная с value и повторяя оценку ++value.

Функция названа в честь целочисленной функции ⍳ из языка программирования APL.

, например

std::vector<int> result(57 - 23 + 1);
std::iota(result.begin(), result.end(), 23);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...