2009-06-30 60 views

Trả lời

22

Vâng nó phụ thuộc vào cách bạn muốn hiển thị chúng, nhưng bạn luôn có thể lặp chúng một cách dễ dàng:

typedef map<string, list<string>>::const_iterator MapIterator; 
for (MapIterator iter = mapex.begin(); iter != mapex.end(); iter++) 
{ 
    cout << "Key: " << iter->first << endl << "Values:" << endl; 
    typedef list<string>::const_iterator ListIterator; 
    for (ListIterator list_iter = iter->second.begin(); list_iter != iter->second.end(); list_iter++) 
     cout << " " << *list_iter << endl; 
} 
+0

lý do tăng sau? – triclosan

+0

@triclosan: Bạn cũng có thể tăng trước, không quan trọng trong trường hợp này. Hay tôi đã hiểu lầm bạn? – Skurmedel

+0

sử dụng tăng sau tăng thêm để tạo đối tượng tạm thời thêm – triclosan

10

Tôi muốn thử những điều sau

void dump_list(const std::list<string>& l) { 
    for (std::list<string>::const_iterator it = l.begin(); l != l.end(); l++) { 
    cout << *l << endl; 
    } 
} 

void dump_map(const std::map<string, std::list<string>>& map) { 
    for (std::map<string,std::list<string>>::const_iterator it = map.begin(); it != map.end(); it++) { 
    cout << "Key: " << it->first << endl; 
    cout << "Values" << endl; 
    dump_list(it->second); 
} 
+0

Nhận 'id không đủ tiêu chuẩn dự kiến ​​trước' <'token' ở dòng đầu tiên: 'void dump_list (const std :: list & l) {'. Tôi có phải bao gồm một cái gì đó? –

+0

Trong dump_list, nó phải là: std :: vector :: const_iterator it = l.begin(); cho (it; it! = L.end(); ++ nó) { std :: cout << * it << std :: endl; } và không l trong cout! Nếu không, nó rất hữu ích cho tôi /Cảm ơn bạn! – Kahin

4

Tôi là một chủ đề ít đi ở đây ...

Tôi đoán bạn muốn kết xuất nội dung bản đồ để gỡ lỗi. Tôi muốn đề cập đến việc phát hành gdb tiếp theo (phiên bản 7.0) sẽ có một trình thông dịch được xây dựng trong python sẽ được sử dụng bởi gcc libstdC++ để cung cấp các máy in đẹp stl. Dưới đây là một ví dụ cho trường hợp của bạn

#include <map> 
    #include <map> 
    #include <list> 
    #include <string> 

    using namespace std; 

    int main() 
    { 
    typedef map<string, list<string> > map_type; 
    map_type mymap; 

    list<string> mylist; 
    mylist.push_back("item 1"); 
    mylist.push_back("item 2"); 
    mymap["foo"] = mylist; 
    mymap["bar"] = mylist; 

    return 0; // stopped here 
    } 

mà kết quả trong

(gdb) print mymap 
$1 = std::map with 2 elements = { 
    ["bar"] = std::list = { 
    [0] = "item 1", 
    [1] = "item 2" 
    }, 
    ["foo"] = std::list = { 
    [0] = "item 1", 
    [1] = "item 2" 
    } 
} 

Yay!

2

hình thức khác, sử dụng <algorithm>:

void printPair(const pair<string, list<string> > &p) 
{ 
    cout << "Key: " << p.first << endl; 
    copy(p.second.begin(), p.second.end(), ostream_iterator<string>(cout, "\n")); 
}  
for_each(mapex.begin(), mapex.end(), printPair); 

chương trình thử nghiệm:

#include <iostream> 
#include <map> 
#include <list> 
#include <iterator> 
#include <algorithm> 
using namespace std; 

void printPair(const pair<string, list<string> > &p) 
{ 
    cout << "Key: " << p.first << endl; 
    copy(p.second.begin(), p.second.end(), ostream_iterator<string>(cout, "\n")); 
} 

int main() 
{ 
    map<string, list<string> > mapex; 

    list<string> mylist1; 
    mylist1.push_back("item 1"); 
    mylist1.push_back("item 2"); 
    mapex["foo"] = mylist1; 
    list<string> mylist2; 
    mylist2.push_back("item 3"); 
    mylist2.push_back("item 4"); 
    mylist2.push_back("item 5"); 
    mapex["bar"] = mylist2; 

    for_each(mapex.begin(), mapex.end(), printPair); 
} 
27

Cập nhật (Trở về tương lai): với C++ 11 phạm vi có trụ sở tại vòng -

std::map<Key, Value> m { ... /* initialize it */ ... }; 

for (const auto &p : m) { 
    std::cout << "m[" << p.first << "] = " << p.second << '\n'; 
} 
0

Bạn có thể viết một hàm quá tải khá chung chung, tốt cho hai mục đích:

  1. Nó hoạt động với bất kỳ map nào.
  2. Nó cho phép sử dụng <<.

Chức năng là

template<class key_t, class value_t> 
ostream& operator<<(ostream& os, const map<key_t, value_t>& m) { 
    for (typename map<key_t, value_t>::const_iterator it = m.begin(); 
      it != m.end(); it++) { 
     os << "Key: " << it->first << ", Value: " << it->second; 
    } 
    return os; 
} 

cout << sẽ làm việc với bất kỳ map<< được định nghĩa cho typename s key_tvalue_t. Trong trường hợp của bạn, điều này không được xác định cho value_t (= list<string>), vì vậy bạn cũng phải xác định nó. Trong một tinh thần tương tự, bạn có thể sử dụng

template<class T> 
ostream& operator<<(ostream& os, const list<T>& l) { 
    for (typename list<T>::const_iterator it = l.begin(); it != l.end(); it++) { 
     os << "\"" << *it << "\", "; 
    } 
    return os; 
} 

Vì vậy, bạn có thể:

  1. Thêm hai chức năng.
  2. Thêm nguyên mẫu nếu cần.
  3. Sử dụng using namespace std; (hoặc thêm std:: nếu cần).
  4. Sử dụng, ví dụ:,
    cout << mapex << endl;
    cout << li << endl;

Hãy nhớ rằng nếu có bất kỳ ứng cử viên khả thi khác cho << s chỉ định (mà tôi mất không có, nếu không bạn có thể sẽ không hỏi câu hỏi này), nó có thể được ưu tiên hơn những cái hiện tại.

Các vấn đề liên quan