Last active
November 21, 2025 20:19
-
-
Save SansPapyrus683/61b65d4d7ec223b48ebf5c3bb382ba8d to your computer and use it in GitHub Desktop.
A useful debugging template for C++.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <deque> | |
| #include <iostream> | |
| #include <map> | |
| #include <set> | |
| #include <unordered_map> | |
| #include <unordered_set> | |
| #include <vector> | |
| template <typename T1, typename T2> | |
| std::ostream& operator<<(std::ostream& out, const std::pair<T1, T2>& pair); | |
| template <typename T> | |
| std::ostream& operator<<(std::ostream& out, const std::vector<T>& vec); | |
| template <typename T, size_t SZ> | |
| std::ostream& operator<<(std::ostream& out, const std::array<T, SZ>& arr); | |
| template <typename T, typename C, typename A> | |
| std::ostream& operator<<(std::ostream& out, const std::set<T, C, A>& set); | |
| template <typename T> | |
| std::ostream& operator<<(std::ostream& out, const std::multiset<T>& set); | |
| template <typename T1, typename T2> | |
| std::ostream& operator<<(std::ostream& out, const std::map<T1, T2>& map); | |
| template <typename T1, typename T2> | |
| std::ostream& operator<<(std::ostream& out, const std::pair<T1, T2>& pair) { | |
| return out << '(' << pair.first << ", " << pair.second << ')'; | |
| } | |
| template <typename T> | |
| std::ostream& operator<<(std::ostream& out, const std::vector<T>& vec) { | |
| if (vec.empty()) { | |
| out << "[]"; | |
| return out; | |
| } | |
| out << '['; | |
| for (int i = 0; i < vec.size() - 1; i++) { | |
| out << vec[i] << ", "; | |
| } | |
| return out << vec.back() << ']'; | |
| } | |
| template <typename T, size_t SZ> | |
| std::ostream& operator<<(std::ostream& out, const std::array<T, SZ>& arr) { | |
| if (SZ == 0) { | |
| out << "[]"; | |
| return out; | |
| } | |
| out << '['; | |
| for (int i = 0; i < SZ - 1; i++) { | |
| out << arr[i] << ", "; | |
| } | |
| return out << arr.back() << ']'; | |
| } | |
| template <typename T> | |
| std::ostream& operator<<(std::ostream& out, const std::deque<T>& deq) { | |
| if (deq.empty()) { | |
| out << "[]"; | |
| return out; | |
| } | |
| out << '['; | |
| for (int i = 0; i < deq.size() - 1; i++) { | |
| out << deq[i] << ", "; | |
| } | |
| return out << deq.back() << ']'; | |
| } | |
| template <typename T1, typename T2> | |
| std::ostream& operator<<(std::ostream& out, const std::unordered_map<T1, T2>& map) { | |
| out << '{'; | |
| for (auto it = map.begin(); it != map.end(); it++) { | |
| std::pair<T1, T2> element = *it; | |
| out << element.first << ": " << element.second; | |
| if (std::next(it) != map.end()) { | |
| out << ", "; | |
| } | |
| } | |
| return out << '}'; | |
| } | |
| template <typename T1, typename T2> | |
| std::ostream& operator<<(std::ostream& out, const std::map<T1, T2>& map) { | |
| out << '{'; | |
| for (auto it = map.begin(); it != map.end(); it++) { | |
| std::pair<T1, T2> element = *it; | |
| out << element.first << ": " << element.second; | |
| if (std::next(it) != map.end()) { | |
| out << ", "; | |
| } | |
| } | |
| return out << '}'; | |
| } | |
| template <typename T> | |
| std::ostream& operator<<(std::ostream& out, const std::unordered_set<T>& set) { | |
| out << '{'; | |
| for (auto it = set.begin(); it != set.end(); it++) { | |
| T element = *it; | |
| out << element; | |
| if (std::next(it) != set.end()) { | |
| out << ", "; | |
| } | |
| } | |
| return out << '}'; | |
| } | |
| template <typename T> | |
| std::ostream& operator<<(std::ostream& out, const std::multiset<T>& set) { | |
| out << '{'; | |
| for (auto it = set.begin(); it != set.end(); it++) { | |
| T element = *it; | |
| out << element; | |
| if (std::next(it) != set.end()) { | |
| out << ", "; | |
| } | |
| } | |
| return out << '}'; | |
| } | |
| template <typename T> | |
| std::ostream& operator<<(std::ostream& out, const std::unordered_multiset<T>& set) { | |
| out << '{'; | |
| for (auto it = set.begin(); it != set.end(); it++) { | |
| T element = *it; | |
| out << element; | |
| if (std::next(it) != set.end()) { | |
| out << ", "; | |
| } | |
| } | |
| return out << '}'; | |
| } | |
| template <typename T, typename C, typename A> | |
| std::ostream& operator<<(std::ostream& out, const std::set<T, C, A>& set) { | |
| out << '{'; | |
| for (auto it = set.begin(); it != set.end(); it++) { | |
| T element = *it; | |
| out << element; | |
| if (std::next(it) != set.end()) { | |
| out << ", "; | |
| } | |
| } | |
| return out << '}'; | |
| } | |
| // Source: https://stackoverflow.com/a/31116392/12128483 | |
| template <typename Type, unsigned N, unsigned Last> | |
| struct TuplePrinter { | |
| static void print(std::ostream& out, const Type& value) { | |
| out << std::get<N>(value) << ", "; | |
| TuplePrinter<Type, N + 1, Last>::print(out, value); | |
| } | |
| }; | |
| template <typename Type, unsigned N> | |
| struct TuplePrinter<Type, N, N> { | |
| static void print(std::ostream& out, const Type& value) { | |
| out << std::get<N>(value); | |
| } | |
| }; | |
| template <typename... Types> | |
| std::ostream& operator<<(std::ostream& out, const std::tuple<Types...>& value) { | |
| out << '('; | |
| TuplePrinter<std::tuple<Types...>, 0, sizeof...(Types) - 1>::print(out, value); | |
| return out << ')'; | |
| } |
For those wanting to be able to print vectors of pairs, simply put the vector function after the pairs. This works for me!
Author
oh yeah i should probably include declarations first huh
Yea, by simply reordering it's possible to print deques/maps/vectors of pairs.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Update : I think It it problem with new GCC-12.2 Compiler ON WINDOWS Platform Only [ from -> https://winlibs.com/ [ CodeForces uses this ] ] , But same thing on Linux Runs without error on same complier version [ Ubuntu gcc-12.2 ] .
Here is the error I am getting when using in Windows Environment [gcc - mingw64]
https://pastebin.com/nFkbAfJD
I think it is a bug with new compiler [ gcc-12 ] gcc on windows is not that as stable as Linux counterpart ]