2016-11-17 2 views
0

У меня возникают проблемы с загрузкой и печатью моей структуры данных карты-карты. Я думаю, что это на стороне печати, так как я не уверен на 100%, как использовать итераторы.Как напечатать вложенный map-vector-map

Я создал и загрузил данные в структуру, чтобы сохранить мои данные здесь: (я создал inner_test и myvector, потому что это выглядело так, как будто я нуждался в них для итераторов. Я не уверен, как итераторы знают, что inner_test и myvector являются частью теста, хотя.)

map<int, map<string, vector<string>>> test; 
map<string, vector<string>> inner_test; 
vector<string> myvector; 

ifstream thisfile; 
const char *file1 = argv[1]; 
thisfile.open(file1); 
string filler; 

while(thisfile >> filler){ 
    string sortedFiller = filler; 
    sort(sortedFiller.begin(), sortedFiller.end()); 
    test[filler.length()][sortedFiller].push_back(filler); 
} 
thisfile.close(); 

Я пытался напечатать его с этим, но я не думаю, что я вполне понимаю, что я здесь делаю.

map<int, map<string, vector<string>>>::iterator itr1; 
map<string, vector<string>>::iterator itr2; 
vector<string>::iterator itr3; 

for(itr1 = test.begin(); itr1 != test.end(); itr1++){ 
    cout << itr1->first; 
    for(itr2 = inner_test.begin(); itr2 != inner_test.end(); itr2++){ 
     cout << itr2->first; 
     for(itr3 = myVector.begin(); itr3 != myVector.end(); itr3++){ 
      cout << *itr3; 
     } 
    } 
    cout << endl; 
} 
+0

Вы могли бы упростить много с 'Multimap < пары, строка>'. –

+0

@JohnZwinck Я не знал о multimap. Если ключ является парой, я должен поставить пару? Или я могу вернуть все данные, соответствующие входному ключу '3'? – user1362058

+0

Хороший вопрос. Вам нужно искать с помощью пары. Однако вы можете вызвать 'mm.lower_bound (make_pair (3, string()))', чтобы получить первое значение с 3, и 'mm.lower_bound (make_pair (4, string()))', чтобы получить прошлое последнее , Насколько я понимаю, это то, что вам нужно. –

ответ

1

Ваши inner_test и my_vector переменные являются пустыми контейнерами и не связаны с фактическим std::map, который вы хотите распечатать, каким-либо образом. Это один из примеров, как можно распечатать многомерный контейнер:

// auto type automatically defines itself as a return type of test.begin() 
for(auto itr1 = test.begin(); itr1 != test.end(); itr1++) 
    { 
    cout << itr1->first << ' '; // Add space to separate entries on the same line 
    // itr1->second represents map<string, vector<string>> stored in test. 
    for(auto itr2 = itr1->second.begin(); itr2 != itr1->second.end(); itr2++) 
     { 
     cout << itr2->first << ' '; 
     // itr2->second represents vector<string> stored in map<string, vector<string>> which is stored in test. 
     for(auto itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++) 
      { 
      cout << *itr3 << ' '; 
      } 
     } 
    cout << endl; 
    } 
+0

Спасибо, отлично работал. Итак, переменные inner_test и myvector создаются только для того, чтобы итератор имел оболочку того же типа структуры, что и для создания итератора? – user1362058

+0

@ user1362058 Нет, вам не нужны эти переменные, как я уже сказал в ответе с выражением _Your 'inner_test', а переменные' my_vector' - пустые контейнеры и ** не связаны ** с фактическим ' std :: map'_ –

+0

ОК. Я совершенно неправильно понял, что вы имели в виду. – user1362058

1

Использование auto вывести тип итератора автоматически, как for(auto itr1 = container.begin(); ....

Затем, перед вторым циклом, добавьте const auto& inner_test = itr1->second; и выполните итерацию по вашей вложенной карте, как и вы.

Аналогичным образом, до третьего цикла добавьте const auto& myVector = itr2->second;.

Что здесь происходит.

В C++ можно перегрузить * и -> операторов. Итераторы делают это.

Когда вы перебираете std::map, итератор указывает std::pair ссылок на ключ и значение. Пара имеет first и second поля, которые в данном случае ссылаются на ключ и значение соответственно.

Кроме того, используйте .cbegin() и .cend() - константные итераторы - если вы не хотите изменять данные на карте.

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