在C++中将std::map复制到std::set

6

使用STL算法是否可以将std::map的值深度复制到std::set中?

我不想在新集合中显式插入。

不想这样显式地操作:

std::map<int, double*> myMap; //filled with something
std::set<double*> mySet;

for (std::map<int, double*>::iterator iter = myMap.begin(); iter!=myMap.end(); ++iter)
{
     mySet.insert(iter->second);
}

但是可以找到更简洁优雅的方法来完成这个任务,使用值的深拷贝。


添加一些代码。你是想复制 mapkey_type 还是 value_type - dirkgently
1
如果有重复的数据怎么办?您是否应该使用“multiset”来代替? - Oliver Charlesworth
不会有重复的,即使有也不重要。 - linello
1
你可以使用SGI的STL中的select2nd,或者从之前的答案中获取。 - Jerry Coffin
或者,使用一个转换迭代器来提取映射键或值。我在另一个问题的答案中提供了几个键迭代器的实现。将它们中的任何一个转换为值迭代器都是一项微不足道的任务。当你说你想要一个“深拷贝”时,你真正应该做的是将指针包装在一个处理类中,在复制时执行“深度”拷贝。 - James McNellis
1个回答

8

这个怎么样?

std::transform(myMap.begin(), myMap.end(), std::inserter(mySet, mySet.begin()),
    [](const std::pair<int, double*>& key_value) {
        return key_value.second;
    });

但这只复制了指针。如果您想进行深层复制,则需要执行以下操作:

std::transform(myMap.begin(), myMap.end(), std::inserter(mySet, mySet.begin()),
    [](const std::pair<int, double*>& key_value) {
        return new double(*key_value.second);
    });

顺便提一下,这段代码使用了lambda函数(仅在C++11及以上版本中可用)。如果你不能用C++11,你可以使用一个函数对象代替。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接