gpt4 book ai didi

c++ - 是否可以将 forward_list 插入到 unordered_map 中?

转载 作者:行者123 更新时间:2023-11-30 05:09:20 25 4
gpt4 key购买 nike

我没有兴趣重新发明轮子。我喜欢保持代码非常紧凑,容器是我喜欢使用的东西,这样我就不必逐行实现所有内容。那么可以一起使用这两个容器吗?

最佳答案

显然你可以。但是,请考虑 Boost Multi-Index。

演示

Live On Coliru

#include <unordered_map>
#include <forward_list>
#include <string>

struct Element {
int id;
std::string name;

struct id_equal final : private std::equal_to<int> {
using std::equal_to<int>::operator();
bool operator()(Element const& a, Element const& b) const { return (*this)(a.id, b.id); };
};
struct name_equal final : private std::equal_to<std::string> {
using std::equal_to<std::string>::operator();
bool operator()(Element const& a, Element const& b) const { return (*this)(a.name, b.name); };
};
struct id_hash final : private std::hash<int> {
using std::hash<int>::operator();
size_t operator()(Element const& el) const { return (*this)(el.id); };
};
struct name_hash final : private std::hash<std::string> {
using std::hash<std::string>::operator();
size_t operator()(Element const& el) const { return (*this)(el.name); };
};
};

int main() {

using namespace std;
forward_list<Element> const list { { 1, "one" }, { 2, "two" }, { 3, "three" } };

{
unordered_map<int, Element, Element::id_hash, Element::id_equal> map;
for (auto& el : list)
map.emplace(el.id, el);
}

{
unordered_map<std::string, Element, Element::name_hash, Element::name_equal> map;
for (auto& el : list)
map.emplace(el.name, el);
}
}

多索引演示

这实现了相同的目标,但是:

  • 就地(没有容器的拷贝)
  • 索引始终同步
  • 没有手动自定义散列/相等函数对象

Live On Coliru

#include <string>
#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>

struct Element {
int id;
std::string name;
};

namespace bmi = boost::multi_index;
using Table = bmi::multi_index_container<Element,
bmi::indexed_by<
bmi::hashed_unique<bmi::tag<struct by_id>, bmi::member<Element, int, &Element::id> >,
bmi::hashed_non_unique<bmi::tag<struct by_name>, bmi::member<Element, std::string, &Element::name> >
>
>;

int main() {

using namespace std;
Table const list { { 1, "one" }, { 2, "two" }, { 3, "three" } };

for (auto& el : list.get<by_name>())
std::cout << el.id << ": " << el.name << "\n";

for (auto& el : list.get<by_id>())
std::cout << el.id << ": " << el.name << "\n";
}

关于c++ - 是否可以将 forward_list 插入到 unordered_map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46252475/

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