Добавление записи в deque c ++ - PullRequest
       31

Добавление записи в deque c ++

0 голосов
/ 16 октября 2018

У меня есть структура

typedef struct myStruct {
   std::vector<std::vector<int>> something;
   std::complex<double> const &x;
   std::complex<double> const &y;
   unsigned int const z;
   unsigned int const w;
   unsigned int const m;
} myStruct;

И я создал deque на основе этого типа структуры, например:

std::deque<myStruct> deq;

Теперь я хотел бы заполнить новую функцию, добавивновая запись в этой очереди:

void newFunction(...){
deq.insert(...);
}

Как я могу заполнить эту функцию, добавив новую запись в мою очередь, типа myStruct?Моя проблема в том, что у меня есть некоторые ссылки в типе структуры и я не могу понять, как это сделать.

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете сделать что-то вроде этого:

Сначала, конструктор в вашей структуре, который инициализирует все элементы.

   myStruct(std::vector<std::vector<int>> v, 
    std::complex<double> const &x,
    std::complex<double> const &y,
    unsigned int const z,
    unsigned int const w,
    unsigned int const m): something(v), x(x), y(y), z(z), w(w), m(m) {}

Затем, в вашем newFunction, используйте emplace_back длявставьте элемент в конце deque.

   std::vector<std::vector<int>> v; //Initialize this vector if required.
   std::complex<double> const x = {1.0, 2.0}; //Example
   std::complex<double> const y = {1.0, 2.0};
   unsigned int const z = 10;
   unsigned int const w = 20;
   unsigned int const m = 30;
   deq.emplace_back(v, x, y, z, w, m);
0 голосов
/ 16 октября 2018

Ваш тип myStruct не имеет конструктора - ни одного, который вы объявили (потому что вы этого не сделали), и не тот, который компилятор синтезировал для вас (потому что он не знает, как это сделать).

Разумеется, можно создавать объекты этого типа с помощью агрегатной инициализации, которая является единственной возможностью, которую вы оставили для себя:

std::complex<double> x, y;
myStruct obj = {{}, x, y, 1, 2, 3};

Теперь вы должны иметь возможность копировать-создавать декуэлемент из него:

deq.push_back(obj);

Но вы не сможете использовать emplace_back для конструирования на месте, пока тип не имеет конструктора.

Вы можете используйте emplace_back для вызова синтезированного конструктора перемещения:

deq.emplace_back(std::move(obj));

, но вы все еще хотите иметь правильный конструктор для вашего типа.

Кроме того, поскольку myStruct содержит const члены, он не может быть назначен для копирования.По этой и по нескольким другим причинам тип не предназначен для использования в стандартном контейнере.

И я нервничаю по поводу хранения «сырых» ссылок внутри объекта, а затем помещаю этот объект в контейнер,Что обеспечивает достоверность этих ссылок?

Наконец, остановимся на ненужной идиоме typedef.Это то, что мы делали в Си еще в 1820-х годах, чтобы мы могли вызывать тип myStruct вместо struct myStruct везде;в C ++ myStruct - это класс, и вы можете просто назвать его напрямую, не прибегая к подобным хитростям.Иногда люди придерживаются трюка typedef, когда их класс также должен быть включен в исходный код на C, то есть для совместимости, но с членами std::vector и std::complex вы наверняка этого не сделаете.

...