3

我通常用 C 编写代码。现在转向 C++。我有std::unordered_map6000 万个条目。它只加载一次,以后不会修改。我想不时将它传递给一些函数。但是这段代码每次都会复制哈希映射:

typedef unordered_map<uint64_t, mer*> mer_map;
void test_pass_by_ref3(mer_map kmers) {
}

void test_pass_by_ref2(mer_map kmers) {
    test_pass_by_ref3(kmers);
}

void test_pass_by_ref(mer_map kmers) {
    test_pass_by_ref2(kmers);
}

如果我想传递pointer唯一的,如何传递它并像往常一样查询它:value = mer_map[key]?我搜索并找到了passing by reference语法:

void foo(const ClassName &name)
{
    ClassName& temp = const_cast<ClassName&>(name);
    ... ....
}

但它似乎无法编译。请帮忙。谢谢。

4

3 回答 3

13

我猜您的问题是operator[]non const,因为当使用地图中尚不存在的键访问时,它会添加一个默认构造元素。您可以使用at(),它假定密钥存在,否则抛出异常:

typedef unordered_map<uint64_t, mer*> mer_map;

void foo(const mer_map& m)
{
  mer* val = m.at(key);
}

或使用std::unordered_map::find()

void foo(const mer_map& m)
{
  auto it = m.find(key);
  if (it != m.end())
  {
    // element is in map, use it
    mer* val = it->second;
  }
}

注意:您也可以通过传递非常量引用来绕过该问题,但这样做意味着该函数会修改映射。如果你真的打算修改一个对象,你应该只使用非常量引用。

void foo(mer_map& m)
{
  mer* val = m[key];
}
于 2013-04-04T15:41:08.800 回答
3

要使用引用传递,您的函数应声明为

typedef unordered_map<uint64_t, mer*> mer_map;
void test_pass_by_ref3(mer_map& kmers) {
}

void test_pass_by_ref2(mer_map& kmers) {
    test_pass_by_ref3(kmers);
}

void test_pass_by_ref(mer_map& kmers) {
    test_pass_by_ref2(kmers);
}

这对于访问操作员来说是正常的

mer_map[key]

并访问类似的成员函数

mer_map.find(

要传递一个指针,它们应该是形式

typedef unordered_map<uint64_t, mer*> mer_map;
void test_pass_by_poi3(mer_map *kmers) {
}

void test_pass_by_ref2(mer_map *kmers) {
    test_pass_by_poi3(kmers);
}

void test_pass_by_ref(mer_map *kmers) {
    test_pass_by_poi2(kmers);
} 

但是,在使用访问运算符的指针版本中,您必须首先取消引用指针。

(*mer_map)[key]

并访问类似的成员函数

kmers->find(
于 2013-04-04T15:39:55.683 回答
0

Formapunordered_map索引运算符[]是非常量的,因为使用不存在的索引调用它会导致创建该元素。at()如果您不想创建元素,请使用。然后你可以使用 const 引用mapor unordered_map。请注意,at()如果元素不存在,则会抛出。

您可以使用迭代器来测试是否存在:

bool
esists(const mer_map& kmers, uint64_t i)
{
  unordered_map<uint64_t, mer*::const_iterator it = kmers.find(i);
  return it != kmers.end();
}

或者您可以通过代码中的迭代器访问 mer_maps。

于 2013-04-04T15:49:50.217 回答