gpt4 book ai didi

c++ - 容器模板参数 std::map 或 std::vector

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:50 25 4
gpt4 key购买 nike

在我的一个项目中,我使用了树实现,其中我使用了容器 C=std::map<K,V>为每个树节点维护一个子节点列表。每个树节点都有一个唯一的名称键 K通常是 std::string .

template<typename V, template<typename Key=std::string,typename Type=TreeNode<V>,typename ...> typename C>
class TreeNode {
typedef C<std::string, Value> cont_type;
typedef V data_type;

cont_type childs;
data_type value;

cont_type::iterator genericFind(const K& k) {
// Something generic here!!!
}
}

除了 std::map 不遵守树中的插入顺序这一事实之外,这个实现对我来说效果很好。对于某些应用程序,我需要保持插入顺序,但对于其他应用程序,快速检索信息的需求更为重要。

因此 C需要是任何一种类型

std::vector<std::pair<K, V>> // keeping insertion order

std::map<K,V> // fast information retrivial

不,我的 TreeNode 的执行有问题类,仍然显式使用 std::map 的接口(interface).特别是,它使用成员函数 find , erase , insert需要替换为通用的东西,其中两种容器类型的实现都非常具体。

例如childs.find(key)需要替换为find(childs.begin(), childs.end(), key) , 每当我插入 std::vector实现。

也许还有另一种我不知道的解决方案。这可能是 boost::multi_index ,但我对此很不确定。

解决我的问题最简单的方法是什么?

最佳答案

您可以创建专用的重载函数并使用它们

template <typename Key, typename V>
auto my_find(std::map<Key, V>& m, const Key& key)
{
return m.find(key);
}

template <typename Key, typename V>
auto my_find(std::vector<std::pair<Key, V>>& v, const Key& key)
{
return std::find_if(v.begin(), v.end(), [&](const auto& p) {
return p.first == key;
});
}

关于c++ - 容器模板参数 std::map 或 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39343582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com