2014-12-30 5 views
0

나는 연산자 오버로딩을 사용하여 여러 종류의 컨테이너를 인쇄하려고합니다. 그러나 map<int, stack<vector<int > > >을 인쇄 할 때 스택이 있어야하는 빈 문자열을 반환합니다. 스택을 별도로 인쇄하려고해도 아무런 문제가 없습니다.연산자 오버로드를 통해지도 내용 작성

#include <vector> 
#include <stack> 
#include <deque> 
#include <set> 
#include <iostream> 
#include <map> 
using namespace std; 

typedef struct { 
    string naam; 
    int leeftijd; 
}Persoon; 

ostream& operator<<(ostream& out, const Persoon &p) { 
    out<<"! "<<p.naam<<" "<<p.leeftijd<<" !"; 
    return out; 
} 
template<typename D, typename T> 
ostream& operator<<(ostream&out, map<T,D> &m) { 
    typename map<T,D>::iterator my_it = m.begin(); 
    out<<"[*] "; 
    while(my_it != m.end()) { 
     cout<<my_it->first<< " -> "<<my_it->second<<" "; 
     my_it++; 
    } 
    out<<"[*]\n"; 
} 
template<typename T> 
ostream& operator<<(ostream& out, vector<T> &v){ 
    out<<"["; 
    int i; 
    for(i = 0; i < v.size()-1; i++) { 
     out<<v[i]<<"|"; 
    } 
    out<<v[i]<<"]\n"; 
    return out; 
} 
template <typename T> 
ostream& operator<<(ostream& out, stack<T> &s){ 
    out<<"{"; 
    while(!s.empty()) { 
     out<<"|"<<s.top()<<"|"; 
     s.pop(); 
    } 
    out<<"}\n"; 
    return out; 
} 
int main() { 
    vector<int> v(5,3); 
    /*cout<<v; 
    stack<string> s; 
    s.push("Plate1"); 
    s.push("Plate2"); 
    s.push("Plate3"); 
    cout<<s; 
    map<int, Persoon> m; 
    Persoon Bill = {"Bill",59}; 
    Persoon Steven = {"Steven",79}; 
    Persoon Rob = {"Rob",26}; 

    m.insert(pair<int,Persoon>(59,Bill)); 
    m.insert(pair<int,Persoon>(79,Steven)); 
    m.insert(pair<int,Persoon>(26,Rob)); 
    cout<<m; 
    */ 
    stack<vector<int> > s2; 
    s2.push(v); 
    s2.push(v); 
    cout<<s2; 

    map<int, stack<vector<int> > > m2; 
    m2.insert(pair<int, stack<vector<int> > >(5,s2)); 
    cout<<m2; 
} 
+0

코드에 몇 가지 변경을해야했습니다. ostream & operator << (ostream & out, 벡터 & v)'에서 'int i'를'size_t i '로 변경하고'ostream & operator << (ostream & out, map & m)'에'return out'을 추가하십시오. 그 후 모든 것이 잘 작동했습니다. 작업 코드 체크 아웃 : http://ideone.com/S3fXF1 –

답변

2

통신사 스택에 대한 < < 스택 떨어져 모든 요소를 ​​보여주고, 그래서 스택은 그것의 사본이 맵에 넣을 수 있도록 시간으로 비어 있습니다. 내가 변경하는 경우

는 설명하기 위해 당신이에) (주 :

int main() { 
     stack<int> s2; 
     s2.push(1); 
     s2.push(2); 
     cout << s2.size() << '\n'; 
     cout << s2; 
     cout << s2.size() << '\n'; 
    } 

출력은 : 지금까지 내가 말할 수있는

2 
{|2||1|} 
0 

, 터지는 유일한 방법은 "반복 처리 "스택 요소 (C++ 11에서도)를 넘기 때문에 연산자 내부에 스택의 복사본을 만들고 모든 복사본 요소를 제거 할 수밖에 없습니다. 이 코드는 나를 위해 작동하는 것 같습니다 :

ostream& operator<<(ostream& out, stack<T> &s){ 
     stack<T> scopy = s; 
     out<<"{"; 
     while(!scopy.empty()) { 
      out<<"|"<<scopy.top()<<"|"; 
      scopy.pop();  
     } 
     out<<"}\n"; 
     return out; 
    }