【问题标题】:Writing the contents of a map through operator overloading通过运算符重载写入地图的内容
【发布时间】:2014-12-30 23:14:34
【问题描述】:

我正在尝试使用运算符重载来打印不同类型的容器。但是,当我想打印 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;
}

【问题讨论】:

  • 我不得不对您的代码进行一些更改。将ostream&amp; operator&lt;&lt;(ostream&amp; out, vector&lt;T&gt; &amp;v) 中的int i 更改为size_t i,并将return out; 添加为ostream&amp; operator&lt;&lt;(ostream&amp;out, map&lt;T,D&gt; &amp;m)。之后一切正常。结帐工作代码:ideone.com/S3fXF1

标签: c++ dictionary containers overloading ostream


【解决方案1】:

您的 operator

为了演示,如果我将您的 main() 更改为:

    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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2021-07-29
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多