用 Boost.Bimap 替换向量和哈希表

发布于 2024-10-02 22:17:12 字数 615 浏览 2 评论 0原文

我希望用 boost 替换 vectorboost::unordered_map 将字符串映射到前者的索引: :bimap

我应该使用什么bimap实例化?到目前为止,我已经想出了

typedef bimap<
    unordered_set_of<size_t>,
    vector_of<string>
> StringMap;

,但我不确定现在是否已经颠倒了集合类型。另外,我想知道是否应该更改 关系类型的集合vector_of_relation 是我的最佳选择,还是 set_of_relation,或者只是使用默认值?

I'm looking to replace a vector<string> and a boost::unordered_map<string, size_t> mapping string to indices in the former with a boost::bimap.

What instantiation of bimap should I use? So far, I've come up with

typedef bimap<
    unordered_set_of<size_t>,
    vector_of<string>
> StringMap;

but I'm not sure if I've reversed the collection types now. Also, I wonder if I should change the collection of relations type. Would a vector_of_relation be my best choice, or a set_of_relation, or just go with the default?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

睫毛上残留的泪 2024-10-09 22:17:12

要获得 size_t 和 std::string 之间的 bimap,其中您有〜常数(取决于散列和任何潜在冲突的成本),您需要使用 unordered_set_of:

#include <boost/bimap.hpp>
#include <boost/bimap/unordered_set_of.hpp>
#include <string>
#include <iostream>
#include <typeinfo>

int main(int argc, char* argv[]) {

  typedef boost::bimap< boost::bimaps::unordered_set_of<size_t>, boost::bimaps::unordered_set_of<std::string> > StringMap;
  StringMap map;
  map.insert(StringMap::value_type(1,std::string("Cheese")));
  map.insert(StringMap::value_type(2,std::string("Cheese2")));

  typedef StringMap::left_map::const_iterator const_iter_type;
  const const_iter_type end = map.left.end();

  for ( const_iter_type iter = map.left.begin(); iter != end; iter++ ) {
    std::cout << iter->first << " " << map.left.at(iter->first) << "\n";
  }

}

returns:

1 Cheese
2 Cheese2

unordered_set 是 set 的增强版本,它使用哈希表而不是用于存储元素的树,请参阅 Boost Unordered 文档

查看 Bimap 示例,我们有:

左侧地图视图的工作方式类似于 std::unordered_map< std::string,长>,
给定国家的名称,我们可以用它来搜索恒定时间内的人口

To get a bimap between size_t and std::string where you have ~constant (up to the cost of hashing and any potential clashes) you need to use unordered_set_of:

#include <boost/bimap.hpp>
#include <boost/bimap/unordered_set_of.hpp>
#include <string>
#include <iostream>
#include <typeinfo>

int main(int argc, char* argv[]) {

  typedef boost::bimap< boost::bimaps::unordered_set_of<size_t>, boost::bimaps::unordered_set_of<std::string> > StringMap;
  StringMap map;
  map.insert(StringMap::value_type(1,std::string("Cheese")));
  map.insert(StringMap::value_type(2,std::string("Cheese2")));

  typedef StringMap::left_map::const_iterator const_iter_type;
  const const_iter_type end = map.left.end();

  for ( const_iter_type iter = map.left.begin(); iter != end; iter++ ) {
    std::cout << iter->first << " " << map.left.at(iter->first) << "\n";
  }

}

returns:

1 Cheese
2 Cheese2

The unordered_set is a boost version of set which uses hash tables instead of trees to store the elements, see Boost Unordered docs.

Looking at the comments from one of the bimap examples at Bimap example, we have:

The left map view works like a std::unordered_map< std::string, long >,
given the name of the country we can use it to search for the population in constant time

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文