#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;
}
}