Нахождение длины диапазона в C ++ - PullRequest
2 голосов
/ 23 февраля 2020

Я бросил вызов диапазону, и мне нужно найти количество элементов в нем. Мой текущий код

size_t c = 0;
for(auto elem : range){
     c++;
}
return c;

Однако компилятор жалуется на неиспользуемую переменную elem, и я не могу от нее избавиться. Я хотя бы использовал что-то вроде

std::count_if(range.begin(), range.end(), [](type elem){return ture;});

Но я чувствую, что это излишнее убийство, и оно не кажется правильным.

Мне интересно, есть ли более хороший системный c способ достижения это без определения дополнительной переменной?

Ответы [ 3 ]

4 голосов
/ 23 февраля 2020

Если (по какой-то причине) ваш диапазон не имеет функции-члена size(), вы можете использовать std::distance. Это всегда должно работать, поскольку диапазон должен иметь начальный и конечный итератор.

std::distance(cbegin(range), cend(range));
2 голосов
/ 23 февраля 2020

Вы можете использовать std::distance как

std::distance(range.begin(), range.end());

Возвращает количество прыжков от first до last.

И обратите внимание на сложность:

Сложность

Линейный.

Однако, если InputIt дополнительно отвечает требованиям LegacyRandomAccessIterator , сложность постоянна.

1 голос
/ 23 февраля 2020

В C ++ все контейнеры реализуют size метод постоянной сложности, поэтому если range вы рассмотрите контейнер, то не нужно для повторного изобретения колеса.

Однако вы также можете использовать std::distance, если хотите определить количество элементов из определенного диапазона, например:

std::vector<int> v{ 3, 1, 4 };
std::cout << std::distance(v.begin(), v.end() << std::endl; // 3

Если вы посмотрите на возможная реализация std::distance, это что-то вроде

while (first != last) {
    ++first;
    ++n;
}

, где first и last - начальная и конечная точка вашего диапазона, а n - простой счетчик.

...