#ifndef LIMONP_STD_OUTBOUND_H #define LIMONP_STD_OUTBOUND_H #include #if(__cplusplus == 201103L) #include #include #else #include #include namespace std { using std::tr1::unordered_map; using std::tr1::unordered_set; } #endif #include #include #include #include namespace std { template ostream& operator << (ostream& os, const vector& vec) { if(vec.empty()) { return os << "[]"; } os<<"[\""< ostream& operator << (ostream& os, const pair& pr) { os << pr.first << ":" << pr.second ; return os; } template string& operator << (string& str, const T& obj) { stringstream ss; ss << obj; // call ostream& operator << (ostream& os, return str = ss.str(); } template ostream& operator << (ostream& os, const map& mp) { if(mp.empty()) { os<<"{}"; return os; } os<<'{'; typename map::const_iterator it = mp.begin(); os<<*it; it++; while(it != mp.end()) { os<<", "<<*it; it++; } os<<'}'; return os; } template ostream& operator << (ostream& os, const std::unordered_map& mp) { if(mp.empty()) { return os << "{}"; } os<<'{'; typename std::unordered_map::const_iterator it = mp.begin(); os<<*it; it++; while(it != mp.end()) { os<<", "<<*it++; } return os<<'}'; } template ostream& operator << (ostream& os, const set& st) { if(st.empty()) { os << "{}"; return os; } os<<'{'; typename set::const_iterator it = st.begin(); os<<*it; it++; while(it != st.end()) { os<<", "<<*it; it++; } os<<'}'; return os; } template bool isIn(const ContainType& contain, const KeyType& key) { return contain.end() != contain.find(key); } template basic_string & operator << (basic_string & s, ifstream & ifs) { return s.assign((istreambuf_iterator(ifs)), istreambuf_iterator()); } } #endif