Ошибка при запуске программы pl / sql для нахождения суммы первых 10 простых чисел

Поскольку этот вопрос привлекает так много голосов, и это становится часто задаваемым вопросом, я думаю, было бы лучше написать отдельный ответ, чтобы упомянуть одно существенное различие между C ++ 03 и C ++ 11 относительно влияния std::vector вставка в действительность для итераторов и ссылок по отношению к reserve() и capacity(), которые не удалось заметить в большинстве рассмотренных ответов.

C ++ 03:

Reallocation делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы в последовательности. Гарантируется, что перераспределение не происходит во время вставок, которые происходят после вызова функции reserve (), до тех пор, пока вставка не сделает размер вектора большим, чем размер, указанный в последнем вызове reserve ().

C ++ 11:

Reallocation делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы в последовательности. Гарантируется, что перераспределение не происходит во время вставок, которые происходят после вызова резервирования (), до момента, когда вставка сделает размер вектора большим, чем значение емкости ().

Итак, в C ++ 03 это не «unless the new container size is greater than the previous capacity (in which case all iterators and references are invalidated)», как упоминалось в другом ответе, вместо этого оно должно быть «greater than the size specified in the most recent call to reserve()». Это одно, что C ++ 03 отличается от C ++ 11. В C ++ 03, когда insert() приводит к тому, что размер вектора достигает значения, указанного в предыдущем reserve() вызове (который может быть меньше текущего capacity(), поскольку reserve() может привести к большему capacity(), чем просили), любой последующий insert() может привести к перераспределению и аннулированию всех итераторов и ссылок. В C ++ 11 этого не произойдет, и вы всегда можете доверять capacity() с уверенностью знать, что следующее перераспределение не произойдет до того, как размер превысит capacity().

В заключение, если вы работаете с вектором C ++ 03, и вы хотите удостовериться, что перераспределение не произойдет при выполнении вставки, это значение аргумента, который вы ранее передали reserve(), чтобы вы проверяли размер, а не возвращаемое значение вызова capacity(), в противном случае вы можете удивиться «перераспределению досрочного ».

1
задан kara 20 March 2019 в 11:44
поделиться