2014-01-26 4 views
0

Это не работает. И причина для меня загадочна.3D-вектор структуры emplace_back

PS: Использование C++ 11

http://ideone.com/elopRc

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

using namespace std; 

int main() { 
    struct MyStruct { 
     size_t some_num; 
     char some_char; 
     bool some_bool; 
     MyStruct* some_ptr; 
    }; 

    vector<vector<vector<MyStruct>>> three_d_struct_v; 

    size_t max_i = 100; 
    size_t max_j = 10; 
    size_t max_k = 10; 

    for(size_t i = 0; i < max_i; i++) { 
     for(size_t j = 0; j < max_j; j++) { 
      for(size_t k = 0; k < max_k; k++) { 
       three_d_struct_v.emplace_back(k, 'x', false, nullptr); 
      } 
     } 
    } 


    return 0; 
} 
+3

'three_d_struct_v' не является вектором' MyStruct', это вектор векторов. –

+1

честно говоря, я бы использовал карту карт векторов и просто назову это хорошо. [См. Это в прямом эфире] (http://ideone.com/ybV183). или даже карту карты карт, но безумие должно заканчиваться где-то. – WhozCraig

+0

@WhozCraig ваш идеон запускает 20 миллионов во времени: 3.59 память: 555008 (заканчивается), где в качестве принятого времени ответа: 2.87 памяти: 3468 – ParoX

ответ

0

Здесь three_d_struct_v имеет тип vector<vector<vector<MyStruct>>>, т.е. vector из vector<vector<MyStruct>>, поэтому вам нужно добавить элемент типа vector<vector<MyStruct>> (аналогично для вложенной Габаритные размеры). Однако в вашем коде вы добавляете элемент типа MyStruct напрямую.

Вам нужно изменить что-то вроде:

for(size_t i = 0; i < max_i; i++) { 
    vector<vector<MyStruct>> v1; 
    for(size_t j = 0; j < max_j; j++) { 
     vector<MyStruct> v2; 
     for(size_t k = 0; k < max_k; k++) { 
      MyStruct a = {k, 'x', false, nullptr}; 
      v2.emplace_back(move(a)); 
     } 
     v1.emplace_back(move(v2)); 
    } 
    three_d_struct_v.emplace_back(move(v1)); 
} 

Отъезд ideone для всего кода.

+0

Хотя я понимаю, в чем была исходная ошибка, я все еще получаю другую: http://ideone.com/elopRc – ParoX

+0

@BHare См. Обновленный. – herohuyongtao

+0

Возможно, вы захотите заменить все экземпляры 'v1.emplace_back (x)' на 'v1.emplace_back (std :: move (x))', чтобы избежать ненужных копий. – 0x499602D2

Смежные вопросы