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

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

Formapおよびunordered_mapインデックス演算子[]は、存在しないインデックスで呼び出すとその要素が作成されるため、const ではありません。at()要素を作成したくない場合に使用します。map次に、またはへの const 参照を使用できますunordered_mapat()要素が存在しない場合はスローされることに注意してください。

イテレータを使用して存在をテストできます。

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 に答える