c++ - 哪个容器使用 map 或 set 或者其他?

标签 c++ c++11 dictionary set

如果使用 std::map<std::string,object>为了让对象按名称排序, map 的 value_type ( std::pair<string,object> ) 是一个方便的类,它保证了有用的功能,例如

typedef std::map<std::string,object> object_map;
typedef typename object_map::value_type named_object;
void function(named_object const&);

// with the following possible use case
void foo(std::string const&name, object_map const &omap)
{
  auto obj=omap.find(name);
  if(obj==omap.end()) throw std::runtime_error("name not found");
  function(*obj);
}

到目前为止,还不错。我稍后扩展我的对象

struct extended_object : object { /* more data */ };

并通过 std::map<std::string,extended> 保持扩展对象按名称排序. 我可以定义。

typedef std::map<std::string,extended_object> extended_object_map;
typedef typename extended_object_map::value_type named_extended_object;

很遗憾,我不能

void foo(std::string const&name, extended_object_map const& emap)
{
  auto eobj=emap.find(name);
  if(eobj==emap.end()) throw std::runtime_error("name not found");
  function(*eobj);        // cannot convert *eobj to const named_object&
}

现在,我的问题是如何解决这个问题?我考虑过使用 reinterpret_cast<>

  function(reinterpret_cast<const named_object&>(*eobj));

本质上假设 named_object 的数据布局和 named_extended_object与 base 和 derived 完全一样。这安全/值得推荐吗? 或者,我考虑使用 std::set (而不是 std::map )与键类型 named_object并重新定义

struct named_extended_object : named_object { /* more data */ };

这种方法的问题在于,为了 std::set::find()一个对象,我必须提供的不仅仅是一个名称字符串,而是整个对象甚至扩展对象。根据cppreference , std::set::find()将在 C++14 中解决此问题(重载 3 和 4),但同时我应该做什么?

最佳答案

将您的功能更改为

void function(const std::string& name, const object& obj);

然后像这样调用它

auto obj = omap.find(name);
function(obj->first, obj->second);
// or
auto eobj = emap.find(name);
function(eobj->first, eobj->second);

关于c++ - 哪个容器使用 map 或 set 或者其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23407993/

相关文章:

c++ - 使用长双

c++ - DLL 需要来自它将链接到的应用程序的符号(一个类)

c++ - 当模板参数无效时如何抛出异常?

c++ - VS2010 中的正向/强枚举

c++ - 为什么未按顺序从 CMap 中检索元素

python - csv 中第一位数字的数字频率,不导入

c++ - Unsigned long 回到指向类的指针

C++派生类访问基类成员

使用 lambda 的 c++11 排序列表

python - 将 XML 转换为 Dict/JSON