Как перебрать диапазон на основе цикла с переменной конечной точкой - PullRequest
2 голосов
/ 30 октября 2019

Я пытаюсь использовать диапазон на основе цикла для итерации от начала вектора до индекса переменной x, как показано.

void algorithm(vector<int> arr, int n)
{
int count=0;
for (int i:arr[n])
count++;
}

Я понимаю, что приведенная выше функция довольно бесполезна, но я 'Я пытаюсь концептуально понять, есть ли способ сделать это. arr[n] выдает ошибку, как и arr.begin()+n

Ответы [ 4 ]

2 голосов
/ 30 октября 2019

Вы можете увеличить счетчик и break цикл, когда будет достигнут желаемый счет.

Что-то вроде:

void func(const std::vector<int> & v, std::size_t n)
{
    std::size_t count(0);

    for(int e : v)
    {
        if(count < n)
        {
            std::cout << e << " "; // Do what you want with e.
            ++count;
        }
        else
            break; // Exit the loop
    }
}

Но Я бы не рекомендовал делает это. Циклы for на основе диапазона предназначены для перебора всего контейнера. Таким образом, приведенное выше решение является менее читаемым способом:

void func(const std::vector<int> & v, std::size_t n)
{
    for(std::size_t i = 0; (i < v.size()) && (i < n); ++i)
    {
        std::cout << v[i] << " "; // Do what you want with v[i].
    }
}

Или также:

void func(const std::vector<int> & v, std::size_t n)
{
    std::size_t count(0);
    for(std::vector<int>::const_iterator cit = v.cbegin(); (cit != v.cend()) && (count < n); ++cit, ++count)
    {
        std::cout << *cit << " "; // Do what you want with *cit
    }
}
2 голосов
/ 30 октября 2019

Основанный на диапазоне цикл for - это чистый сахар - он может выполнять итерации только по всему диапазону.

Если вам нужно поиграть с итераторами, вы должны использовать цикл for.

0 голосов
/ 30 октября 2019

Просто добавьте к предыдущим ответам:

Хотя в настоящее время это невозможно, C ++ 20 будет поставляться с гораздо большей поддержкой диапазонов. Я нашел эту статью полезной для понимания некоторых из предложенных функций. Насколько я понимаю, вы сможете написать

void algorithm(vector<int> arr, int n){
   int count=0;
   for (int i: arr | take(n))
      count++;
}

В этом предложении нет реализации , поэтому я не знаю, как проверить мой код.

0 голосов
/ 30 октября 2019

В соответствии с документом цикл for переводится в:

{

    auto && __range = range_expression ;
    for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {

        range_declaration = *__begin;
        loop_statement

    }

} 

, поэтому вы не можете установить конечную точку, как пытаетесь, потому что это итератор для местаи это не arr.end (). но если вы знаете конечный индекс, вы можете попробовать сделать это:

vector<int> new_vec(arr.begin(), arr,(begin()+index));
for(auto& e:new_vec)
{
//some code
}
...