Multimap上的C++通用编程

C++ Generic Programming on Multimap

本文关键字:编程 C++ 上的 Multimap      更新时间:2023-10-16

多映射如下所示:

int main() {
    multimap<int, string> coll;
    coll = { {5, "tagged"} ,
             {2, "a"} ,
             {1, "this"} ,
             {4, "of"} ,
             {6, "strings"} ,
             {1, "is"} ,
             {3, "multimap"} 
          };
}

现在,我想获得一个如下的函数模板,以逐个打印这些容器中的所有值元素,包括multimap,但不限于这种类型的映射和这对特定的模板参数。

void PrintAllMaps(multimap<int, string> map) {
    for (auto elem : map) {
        cout << elem.second << ' ';
    }
    cout << endl;
}

包括多映射但不限于

如果我理解正确,你想要一个模板模板功能:

template <
    typename T1, 
    typename T2, 
    typename T3, 
    typename T4, 
    template <typename, typename, typename, typename> class M>
void PrintAllMaps(M<T1, T2, T3, T4>& map) {
    ...
}

请注意,std::multimap和其他类似std::map的容器实际上需要两个以上的模板参数,其余的都具有默认类型。

请参阅实时演示

我在通用容器函数方面运气不错:

template <class Map>
void PrintMapToStream(std::ostream &stream, const Map &map) {
    for (auto &elem : map)
        stream << elem.second << ' ';
    stream << std::endl;
}

当然,如果您在不允许对其进行迭代的情况下调用它,那么这将失败,并显示令人困惑的错误消息。

template <class TKey>
template <class TValue>
void PrintMapToStream(std::ostream &stream, multimap<TKey, TValue> map)
{
    for (auto elem : map)
        stream << elem.second << ' ';
    stream << std::endl;
}

然后只是:

PrintMapToStream(std::cout, map);