Но почему это не приводит к segfault?
Потому что звезды выровнены.Или вы работали в режиме отладки, и компилятор сделал что-то, чтобы «помочь» вам.Суть в том, что вы делаете неправильную вещь и перешли в темный и недетерминированный мир неопределенного поведения.Вы reserve
одна точка в векторе, а затем пытаетесь втиснуть 5 элементов в reserve
-области.Плохо.
У вас есть 3 варианта.В моем личном порядке предпочтений:
1) Используйте back_insert_iterator
, который предназначен именно для этой цели.Предоставлено #include <iterator>
.Синтаксис немного причудливый, но, к счастью, есть хороший ярлык с сахарным покрытием, back_inserter
также предоставляется:
#include <iterator>
// ...
copy( p, p+5, back_inserter(v) );
2) assign
элементы вектора.Я предпочитаю этот метод чуть менее просто, потому что assign
является членом vector
, и это кажется мне несколько менее общим, чем использование somethign из algorithm
.
v.assign(p, p+5);
3) reserve
правильное количество элементов, затем скопируйте их.Я считаю, что это последний шаг на случай, если все остальное не получится по какой-либо причине.Он основан на том факте, что хранилище vector
является смежным, поэтому оно не является универсальным, и это просто похоже на секретный метод передачи данных в vector
.