Как получить все ключи из STL hash_map? - PullRequest
2 голосов
/ 15 января 2012

Есть ли способ получить все ключи из hash_map STL? Или я должен использовать что-то вроде set или hash_set для записи их перед вставкой?

Ответы [ 4 ]

7 голосов
/ 15 января 2012
hash_map<string, void *> hashMap;

vector<string> keys;
keys.reserve(hashMap.size());

for (hash_map<string, void *>::iterator iter = hashMap.begin(); 
                                        iter != hashMap.end(); 
                                        ++iter)
{
    keys.push_back(iter->first);
}
4 голосов
/ 15 января 2012

Опираясь на ответ Игоря Окса:

hash_map<string, void *> hashMap;

vector<string> keys;
keys.reserve(hashMap.size());

transform(hashMap.begin(), hashMap.end(), back_inserter(keys),
    select1st<hash_map<string, void*>::value_type>());
4 голосов
/ 15 января 2012

Просто переберите hash_map; для каждой итерации ключом является iter->first.

0 голосов
/ 15 января 2012

Вы можете перебрать hash_map и извлечь первый элемент из пары, указанной текущим значением итератора (первый элемент пары фактически является ключом).

// Assuming that hm is an instance of hash_map:
for (auto it = hm.begin(); it != hm.end(); ++it) // for each item in the hash map:
{
    // it->first is current key
    // ... you can push_back it to a vector<Key> or do whatever you want
}

Этовозможная функция для извлечения ключей из hash_map в вектор:

template <typename Key, typename Type, typename Traits, typename Allocator>
vector<Key> extract_keys(const hash_map<Key, Type, Traits, Allocator> & hm)
{
    vector<Key> keys;

    // If C++11 'auto' is not available in your C++ compiler, use:
    // 
    //   typename hash_map<Key, Type, Traits, Allocator>::const_iterator it;
    //   for (it = hm.begin(); ...)
    //
    for (auto it = hm.begin(); it != hm.end(); ++it)
    {
        keys.push_back(it->first);
    }

    return keys;        
}
...