Блог пользователя vintage_Vlad_Makeev

Автор vintage_Vlad_Makeev, 10 лет назад, По-русски

Здравствуйте!

Уже в который раз натыкаюсь на странные runtime error, вероятно, связанные с неправильным использованием векторов. Что с этим делать?

Задача

Код

Огромное спасибо!

  • Проголосовать: нравится
  • -14
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Что с этим делать?

Поставить нормальную IDE с дебаггером и найти баг самостоятельно. Если использовать IDE не позволяет вера — есть gdb.

»
10 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

Смотрите комментарий ниже.

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Я не знаю, где ты кодишь. Но у меня Far Manager с g++ 4.7 и он выдаёт warning именно в том месте, где нужно. А вообще есть несколько путей решения:

  1. Установить нормальную IDE (Visual Studio, Clion)
  2. запомнить, что всегда необходимо писать int( a.size())
  3. прописать такой замечательный #define sz(A) (int)(A).size() и везде писать i < sz(a) . Очень удобно.

А вообще нам как-то на кружке рассказали, что именно из-за того, что человек не поставил int(a.size()) на TopCoder Open, он потерял на соревновании крупную сумму денег. После этой истории сразу приучаешь себя писать правильно. Если я правильно помню, этим человеком был Андрей Лопатин. Но не уверен.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится

    А как в этом примере сказывается этот ворнинг с (int)a.size()? Он же портит все, если индекс цикла отрицательным становится, а тут такого нет.

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Ну мало ли что, всё-равно лучше писать с int(a.size()). Хотя, да в этом примере немного другой случай.

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А вдруг у вас просто превышение лимита по памяти. Мне кажется, что при превышение лимита по памяти на informatics.mccme.ru даёт вердикт ошибка выполнения.

Оценим использование памяти. 4203 простых меньше либо равные 40000. Двойной цикл в вашем решении добавит не более 4 * 2 * 42032 байт в вектор "superprimes", что больше разрешённой памяти.(фактический размер вектора может быть в 2 раза больше его .size()).

P. S. заменив вашем решение строчки

for (int i = 0; i < primes.size(); i++)
for (int j = 0; j < primes.size(); j++)

на

for (int i = 0; i < primes.size(); i++)
for (int j = i; j < primes.size(); j++)

я получил Accepted