如何重载和打印 map<map<list<int>*, vector<int>, myFunctorClass>*, int, myFunctorClass> M1

问题描述 投票:0回答:1

我正在尝试打印 map, vector, myFunctorClass>, int, myFunctorClass> M1 如下:

    map<map<list<int>*, vector<int>, myFunctorClass>*, int, myFunctorClass> M1{
     {
        new map<list<int>*, vector<int>, myFunctorClass>{
            {new list<int>({91, 92, 93, 94}), vector<int>({5, 6, 7, 8})},
            {new list<int>({11, 12, 13, 14}), vector<int>({5, 6, 7, 8})},
            {new list<int>({12, 22, 32, 42}), vector<int>({5, 6, 7, 8})}
        }, 1
    },
    {
        new map<list<int>*, vector<int>, myFunctorClass>{
            {new list<int>({11, 21, 31, 41}), vector<int>({51, 61, 71, 81})}
        }, 100
    },
    {
        new map<list<int>*, vector<int>, myFunctorClass>{
            {new list<int>({12, 22, 32, 42}), vector<int>({52, 62, 72, 82})}
        }, 16
    }
};
cout << M1 << endl;

我使用模板来重载运算符<<

template<class T> ostream& operator<<(ostream& str, const map<T*, int, myFunctorClass>& M);
template<class T>ostream& operator<<(ostream& str, const list<T*>& L);
template<class T>ostream& operator<<(ostream& str, const vector<T>& v);
template <class T1, class T2> ostream& operator<<(ostream& str, const map<T1*, T2, myFunctorClass>& m);

template<class T>ostream& operator<<(ostream& str, const list<T*>& L) {
str << " < ";
for (auto& i : L) {
    str << *i << " ";
}
str << " > ";
return str;
}
template<class T>ostream& operator<<(ostream& str, const vector<T>& v) {
str << " [ ";
for (auto& i : v) {
    str << i << " ";
}
str << " ] ";
return str;
}
template <class T1, class T2> ostream& operator<<(ostream& str, const map<T1*, T2, myFunctorClass>& m) {
str << "{ ";
for (auto i : m) {
    str << *i.first << " " << i.second;
}
str << "}";
return str;
}
template<class T>ostream& operator<<(ostream& str, const map<T*, int, myFunctorClass>& M) {
str << "{\n";
for (auto& i : M) {

    str << " { " << i.first;
    str << " " << i.second;
    str << " }\n";
}

str << " \n}";
return str;
}

然而,我只能得到这样的结果

{
   { 000001EE7768F950 1 }

}

它应该打印这样的东西(数字不匹配):

{
{ < 1 2 3 > [ 5 6 7 8 ] < 4 5 3 > [ 15 6 7 8 ] < 11 2 3 > [ 5 26 7 8 ]  2 }
{ < 1 2 3 > [ 5 116 7 8 ] < 4 5 3 > [ 15 6 7 8 ] < 11 2 3 > [ 5 26 7 8 ]  100 }
{ < 1 2 13 > [ 5 26 17 8 ] < 31 2 3 > [ 5 6 77 8 ] < 45 15 3 > [ 11 6 17 8 ]  50 }
}

我做错了什么,它只打印地址并且只打印整个地图中的一个元素?

c++ dictionary templates operator-overloading functor
1个回答
0
投票

调用最后一个

operator<<
函数,它在
M
上执行一次循环,因为顶层地图中有一个元素。它按预期打印指向
T
的指针和整数
1
。我假设您希望它输出
T
的值而不是指针。您需要将
i.first
替换为
*i.first
.

这应该产生类似的东西:

{
    { { 0x60000362d1e0  [ 5 6 7 8  ] } 1 }
}

同样,您可能希望输出值而不是内部结构的指针。

© www.soinside.com 2019 - 2024. All rights reserved.