9 votes

C++ Comment insérer une inter plage consécutive dans std::vector ?

Disons que je veux que tous les nombres de 23 à 57 soient dans un vector . Je peux le faire :

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

Mais il s'agit d'une solution à 5 lignes pour un travail simple. Ne puis-je pas le faire de manière plus élégante ? La meilleure syntaxe serait vector<int> result{23 .. 57}; par exemple ou un code aussi trivial d'une ligne. Des options avec C++17 ?

17voto

songyuanyao Points 2265

Vous pouvez utiliser std::iota (depuis C++11).

Remplit la plage [first, last] avec des valeurs séquentiellement croissantes, en commençant par value et en évaluant de manière répétitive ++value .

La fonction est nommée d'après la fonction entière ⍳ du langage de programmation APL.

par exemple

std::vector<int> result(57 - 23 + 1);
std::iota(result.begin(), result.end(), 23);

6voto

Jarod42 Points 15729

Avec gamme-v3 ce serait le cas :

const std::vector<int> result = ranges::view::ints(23, 58); // upper bound is exclusive

0voto

Arne Vogel Points 506

Une autre possibilité encore est d'utiliser boost::counting_iterator [1]. Cela présente également l'avantage de fonctionner avec C++98, si vous avez la malchance d'être coincé avec.

#include <boost/iterator/counting_iterator.hpp>

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

ou, encore plus simple :

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

Notez que, comme une plage normale de demi-ouverture est attendue dans les deux cas, vous devrez utiliser la fonction lastNum+1 et vous ne serez pas en mesure d'insérer numeric_limits<int>::max() (alias INT_MAX ) pour cette raison.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X