Пусть Foo
- любой класс.
Foo f[5];
std::vector<Foo*> v;
Я могу вставить элементы в вектор указателей, используя оператор цикла for:
for (size_t i = 0; i < 5; i++)
v.push_back(&f[i]);
Можно ли вставить их с помощью функции std::vector::insert()
и почему бы и нет? Я несколько раз пробовал это:
v.insert(v.end(), &f[0], &f[5]); // error
Если вы имеете в виду, с одним вызовом insert
, то нет - это может копировать диапазон, при необходимости выполнять преобразования типов, но не может применять произвольные преобразования, такие как выбор адреса каждого элемента.
Вы можете использовать std::transform
:
std::transform(std::begin(f), std::end(f),
std::back_inserter(v),
[](Foo & f) {return &f;});
хотя это, вероятно, менее понятно, чем простой цикл, особенно если вы используете синтаксис нового стиля
for (Foo & foo : f) {
v.push_back(&foo);
}
Да, вы также можете использовать вставку. Но между этими двумя операциями существует несколько различий: -
push_back помещает новый элемент в конец вектора, а вставка позволяет вам выбрать позицию. Это влияет на производительность. вставьте силы для перемещения всех элементов после выбранного положения нового элемента. Вам просто нужно сделать это для этого. Вот почему вставка часто может быть менее эффективной, чем push_back.
insert()
принимает итератор, перед которым помещается новый элемент. В этом вся суть insert()
- возможность выбрать место, куда будет добавлен новый элемент.
insert()
. Например,v.insert(v.end(), &f[i]);
в точности эквивалентно вашей строке с использованиемpush_back()
. Покажите нам некоторые из ваших попыток.f
выпадает из области видимости доv
(в вашем случае это не так), у вас возникнут проблемы с висящими ссылками.