Возврат к началу вектора после достижения конца c

#c #vector

#c #вектор

Вопрос:

В настоящее время у меня есть итератор, который случайным образом увеличивает вектор, я хочу иметь возможность вернуться обратно к началу вектора после достижения конца. У меня есть начальное значение, помещенное в мой генератор случайных чисел, поэтому у меня есть та же последовательность. Очевидно, что в данный момент вектор просто выходит из области видимости

 int main() 
{
vector<int> vectorTest = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 
10, 11, 12, 13, 14, 15, 16,
    17, 18, 19, 20};  

vector <int>::iterator it;

for (it = vectorTest.begin(); it != vectorTest.end(); it = it   rand() % 6)
{ 
    cout << *it << endl;    
}
}
  

Комментарии:

1. Если вы хотите обернуть, вы могли бы сделать что-то вроде it = ( it rand() % 6 ) % vectorTest.size .

2. если вы обернете итератор, вы никогда не достигнете vectorTest.end() . Когда цикл должен прекратиться?

3. Как насчет простого использования индексов? Итераторы не предназначены для этой цели.

4. @user463035818 Я бы хотел, чтобы цикл останавливался после 20.

5. возможно ли, что вы хотите случайную перестановку массива? Или вы действительно хотите выбрать 20 случайных элементов, включая повторения? Для случайных перестановок существует готовое решение в <random> , я думаю

Ответ №1:

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

 int j = 0;
for (int i = 0; j < 20 ; i = (i   rand() % 6) % vectorTest.size(), j  ) {
    cout << vectorTest[i] << endl;
}
  

Комментарии:

1. итераторы тоже хороши, таким же образом: for (auto it = v.begin(); j < 20; std::advance(it, std::min(rand() % 6, std::distance(it, v.end()))))

Ответ №2:

Вы могли бы использовать ranges::view::cycle для бесконечного повторения элементов вектора.

 int main() 
{
    std::vector<int> vectorTest = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};  

    auto repeating = vectorTest | ranges::view::cycle;

    for (auto it = repeating.begin(); /* how to end? */; it = it   rand() % 6)
    { 
        std::cout << *it << std::endl;    
    }
}