Блог пользователя royappa

Автор royappa, история, 4 года назад, По-английски

I seem to remember, but cannot find, a tutorial posted here on how to use new features in C++ to print things more easily from cout.

It showed how to set it up so you can do "cout << x" on several common data structures (vectors, pairs, maps, etc.) and it would print them, e.g., a vector may print out as "32 12 45\n". Of course you would have to implement some code for each datatype you want.

If someone remembers this tutorial or can show how, I would appreciate greatly. Thanks!

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
4 года назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

You need std::ostream& operator <<(std::ostream& output, const YourDataType& data) to print data of YourDataType using cout.

For example,

template <typename T>
std::ostream& operator <<(std::ostream& output, const std::vector<T>& data)
{
    for (const T& x : data)
        output << x << " ";
    return output;
}
  • »
    »
    3 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Can we also overload operator >> to directly take input in vector For example

    vector<int> v(n,0);
    cin >> v;
    

    so it will take input elements upto n values

    • »
      »
      »
      3 года назад, # ^ |
        Проголосовать: нравится +13 Проголосовать: не нравится

      Sure, exactly like in Actium's answer

      template<typename T>
      std::istream& operator>>(std::istream& input, std::vector<T>& data) {
          for (auto& item : data) {
              input >> item;
          }
          return input;
      }
      
      • »
        »
        »
        »
        3 года назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        but it shows error in my ide brother don't what's going wrong here.

        #include <bits/stdc++.h>
        using namespace std;
        
        template <typename T>
        ostream& operator<<(ostream& os, const vector<T>& v)
        {
            os << "[";
            for (int i = 0; i < v.size(); ++i) {
                os << v[i];
                if (i != v.size() - 1)
                    os << ", ";
            }
            os << "]\n";
            return os;
        }
        
        template <typename T>
        istream& operator >> (istream& is,const vector<T>& v){
            for(auto &item:v)
                is >> item;
            return is;
        }
        
        
        int main() {
            vector<int> v(5,0);
            cin >> v;
            cout << v;
            return 0;
        }
        

        It shows error like this

        prog.cpp: In instantiation of ‘std::istream& operator>>(std::istream&, const std::vector<_Tp>&) [with T = int; std::istream = std::basic_istream<char>]’:
        prog.cpp:27:12:   required from here
        prog.cpp:20:12: error: no match for ‘operator>>’ (operand types are ‘std::istream {aka std::basic_istream<char>}’ and ‘const int’)
                 is >> item;
                 ~~~^~~~~~~
        
        • »
          »
          »
          »
          »
          3 года назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Read into variable means change that variable.

          You have const vector<T>& v. You cannot change const variables and items of const vector.

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

https://www.geeksforgeeks.org/operator-overloading-cpp-print-contents-vector-map-pair/ I found this article about printing a vector, map, and pairs using cout <<

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

See any of my submissions for overloading the cout on arrays, vectors, maps, custom classes... I've overloaded the cout class for practically all of std :p

  • »
    »
    4 года назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Wow you really have a lot, thank you. I like your long list of "self-warning comments" even more — that's awesome :-)

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I wouldn't understand why would you want to do this. For stl containers, just use a range-based for loop.

For vectors or sets (if vector name is v and set name is v)

for(auto& i: v) {
    cout << i << ' ';
}

For maps and pairs(mp is name for map and pair)

for(auto& i: mp) {
    cout << i.first << ' ' << i.second << endl;
}