Могу ли я вставить значения в вектор указателей, используя функцию вставки?

0

Пусть 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
  • 2
    Конечно, возможно, вы просто неправильно используете insert() . Например, v.insert(v.end(), &f[i]); в точности эквивалентно вашей строке с использованием push_back() . Покажите нам некоторые из ваших попыток.
  • 0
    Знайте, что если f выпадает из области видимости до v (в вашем случае это не так), у вас возникнут проблемы с висящими ссылками.
Показать ещё 4 комментария
Теги:
vector

2 ответа

1
Лучший ответ

Если вы имеете в виду, с одним вызовом 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);
}
0

Да, вы также можете использовать вставку. Но между этими двумя операциями существует несколько различий: -

push_back помещает новый элемент в конец вектора, а вставка позволяет вам выбрать позицию. Это влияет на производительность. вставьте силы для перемещения всех элементов после выбранного положения нового элемента. Вам просто нужно сделать это для этого. Вот почему вставка часто может быть менее эффективной, чем push_back.

  • 0
    Хорошо, и этот insert() принимает итератор, перед которым помещается новый элемент. В этом вся суть insert() - возможность выбрать место, куда будет добавлен новый элемент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню