C++11: наиболее эффективный способ добавления POD к вектору‹›

Скажем, у меня есть небольшая структура с int, double и std:string.

У меня есть vector этих структур.

Эффективным решением C было бы выделить массив, затем выполнить цикл и установить значения поля. Каждое значение вычисляется только один раз и сохраняется там, где находится его окончательное местонахождение.

В С++ 11 я могу использовать emplace_back(), чтобы не создавать временную структуру в стеке, а затем копировать ее в векторную память и удалять временную структуру. Но я предоставляю список инициализаторов, заключенный в фигурные скобки, для emplace_back(), и компилятор жалуется, что нет соответствующей функции для вызова emplace_back со списком инициализаторов, заключенным в фигурные скобки.

Так должен ли я написать открытый конструктор с тремя аргументами в этом случае? И если бы я это сделал, было бы это так же эффективно, как версия C?


person Swiss Frank    schedule 24.08.2020    source источник
comment
Почему {}? emplace_back принимает переменное количество аргументов, поэтому вы можете сделать emplace_back(i, d, s); Возможно, я неправильно понимаю вопрос. Можете ли вы показать код, с которым у вас возникла проблема?   -  person cigien    schedule 24.08.2020
comment
Вы имеете в виду агрегат? (вместо ПД)   -  person Marc Glisse    schedule 24.08.2020
comment
Что-то, содержащее не-POD, например std::string, также не является POD.   -  person Ulrich Eckhardt    schedule 24.08.2020
comment
Поставьте лайк этому. Это C++17, но вы можете легко адаптировать его к C++11. Кроме того, проверьте это   -  person C.M.    schedule 25.08.2020


Ответы (1)


Поскольку вы упоминаете структуру вместо класса, а также упоминаете C, я подозреваю, что вы не определили конструктор.

С emplace_back вы все равно что-то конструируете; вы делаете это на месте, но вы делаете это. Поэтому вам нужно предоставить конструктор.

#include <iostream>
#include <string>
#include <vector>

struct Foo {
    Foo(int i, double d, std::string s) : i(i), d(d), s(s) {};
    int i;
    double d;
    std::string s;
};

int main() {
    std::vector<Foo> v;
    v.emplace_back(1,2.5,"hello");
    std::cout << v[0].i << ' '
              << v[0].d << ' '
              << v[0].s << ' ';
}
person Enlico    schedule 24.08.2020