То, что вы в основном хотите, это копия, так как std :: map не хранит ключи в std :: set. std :: copy предполагает, что типы значений совместимы, что здесь не так. Тип std :: map :: value_type - это пара std ::. Вы хотите скопировать только первую часть пары, что означает, что вам нужно преобразование std :: transform. Теперь, так как вы будете использовать insert_iterator на множестве, порядок не имеет значения. Std :: set будет сортировать при вставке, даже если карта уже отсортирована.
[править] Код может быть проще. Вершина моей головы, не скомпилирована.
std::transform(MyMap.begin(), MyMap.end(),
std::inserter(MySet, MySet.end()),
boost::bind(&std::pair<Key,Value>::first, _1));
Если у вас есть SGI select1st, вам не нужно boost :: bind.
[править]
Обновлено для C ++ 14
std::transform(MyMap.begin(), MyMap.end(),
std::inserter(MySet, MySet.end()),
[](auto pair){ return pair.first; });