2013-09-04 3 views
2
#include <string> 
#include <iostream> 
#include <map> 
#include <utility> 
using namespace std; 


int main() 
{ 

    map<int, string> Employees; 

    // 1) Assignment using array index notation 
    Employees[5234] = "Mike C."; 
    Employees[3374] = "Charlie M."; 
    Employees[1923] = "David D."; 
    Employees[7582] = "John A."; 
    Employees[5328] = "Peter Q."; 

    cout << Employees; 

    cout << "Employees[3374]=" << Employees[3374] << endl << endl; 

    cout << "Map size: " << Employees.size() << endl; 

    /*for(map<int,string>::iterator ii=Employees.begin(); ii!=Employees.end(); ++ii) 
    { 
     cout << (*ii).first << ": " << (*ii).second << endl; 
    }*/ 
    system("pause"); 
} 

Я хотел бы знать, что добавить для того, чтобы мне напечатать cout << Employees; вместо использования iterator.Because я видел некоторый код, можно непосредственно напечатать содержимое карты с просто cout << Anythg. Интересно, что заставило код работать?Могу ли я напечатать карту STL с соиЬ вместо петли итератора

+1

Если перегрузить оператор << для карты вы, вероятно, могли бы. – Borgleader

+0

Но вы не можете добавить эту перегрузку в 'std :: map' IIRC. – chris

+1

Вы имеете в виду это? http://stackoverflow.com/questions/10750057/c-printing-out-the-contents-of-a-vector Посмотрите на второй ответ. –

ответ

3

Nop, или, по крайней мере, стандартная библиотека не предоставляет стандартную реализацию operator << для контейнера и std::ostream.

Оформить заявку https://github.com/louisdx/cxx-prettyprint или написать собственную реализацию operator<<(std::ostream &, const std::map<T1, T2> &).

Вот простая реализация внешнего, для примера:

#include <map> 
#include <string> 
#include <iostream> 

template<typename T1, typename T2> 
std::ostream &operator<<(std::ostream &stream, const std::map<T1, T2>& map) 
{ 
    for (typename std::map<T1, T2>::const_iterator it = map.begin(); 
     it != map.end(); 
     ++it) 
    { 
     stream << (*it).first << " --> " << (*it).second << std::endl; 
    } 
    return stream; 
} 

int  main(int, char **) 
{ 
    std::map<std::string, int> bla; 

    bla["one"] = 1; 
    bla["two"] = 2; 
    std::cout << bla << std::endl; 
    return (0); 
} 
+0

Я лично избегал этого дизайна, поскольку он включает в себя переопределение оператора для двух классов, ни один из которых не является «моим». Если бы мне это было нужно, я бы написал функцию 'pretty_print', которая возьмет карту, вернет объект' please_pretty_print > 'со ссылкой на' map' и переопределит '<< (ostream &, please_pretty_print >) '. Но я странный. – Yakk

+0

Также обратите внимание, что этот оператор не будет найден в большинстве программ. Скажем, что функция вместо 'main' была' ns :: foo' и что существует тип 'ns :: T', для которого определен перегруженный' ns :: operator <<'. Регулярный поиск найдет 'ns :: operator <<', и ADL добавит в набор только ':: std', где этого оператора нет. –

+0

@ DavidRodríguez-dribeas Перемещение 'operator <<' в пространство имен 'ns' устранит проблему. Однако это не похоже на хорошее решение, потому что вам придется переопределять оператор в каждом пространстве имен, которое может его использовать. Что можно сделать по этому поводу? – Xaqq