C ++ Можете ли вы пройти вектор с помощью for, если for-code потенциально расширяет этот же вектор? - PullRequest
0 голосов
/ 18 апреля 2020

В приведенном ниже примере я заполнил генератор так, что 'distr (eng)' выдает случайное число в диапазоне, определяемом количеством букв в слове (полученным из пользовательского ввода (cin >>)).

Я хочу, чтобы вектор 'brr' содержал случайно сгенерированные числа.

Кроме того, цель состоит в том, чтобы избежать дубликатов, так чтобы при кодировании слова с 7 символами получился вектор с 7 случайно сгенерированными числами (в пределах определенного диапазона), которые отличаются друг от друга. Мой код не дает ошибок, но когда я распечатываю вектор 'brr', ничего не происходит (кажется, пусто). Переменная 'numberofletters' не находится в конфликте со знаком / без знака с .size ().

brr = { 0 };

do
{
    int z = distr(eng);
    int* pz = &z;

    for (it = brr.begin(); it != brr.end(); ++it)
    {  
      if (*it = *pz)
      {
        brr.insert(it, *pz);
      }
      else
      {
        brr.push_back(*pz);
      }
    }
}
while (brr.size() < numberofletters);

1 Ответ

2 голосов
/ 18 апреля 2020

Простой ответ - НЕТ!

Любая вставка в std :: vector может сделать недействительными все итераторы вектора, поскольку весь контент может быть перемещен, если вектор должен перераспределить свою память.

С std :: vector :: insert

Вызывает перераспределение, если новый размер () больше, чем старая емкость (). Если новый размер () больше емкости (), все итераторы и ссылки становятся недействительными. Иначе, только итераторы и ссылки перед точкой вставки остаются действительными. Последний итератор также становится недействительным.

...