【问题标题】:Copy std::map to std::set in c++在 C++ 中将 std::map 复制到 std::set
【发布时间】:2012-06-10 14:48:41
【问题描述】:

是否可以使用 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);
}

但要找到一种更简洁、更优雅的方式来执行此操作,并使用深度复制的值。

【问题讨论】:

  • 添加一些代码。您是要复制map 的key_type 还是value_type?
  • 如果有重复怎么办?你应该改用multiset 吗?
  • 不会有重复,如果有,不重要。
  • 您可以使用来自 SGI 的 STL 或来自 a previous answer 的 select2nd。
  • 或者,使用提取映射键或值的转换迭代器。我在an answer to another question 中提供了几个键迭代器的实现。将其中任何一个转换为值迭代器将是一项微不足道的任务。当你说你想要一个“深拷贝”时,你真正应该做的是将指针包装在一个句柄类中,该句柄类在复制时执行“深”拷贝。

标签: algorithm stl copy stdmap stdset


【解决方案1】:

这个怎么样?

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,你可以使用 function object。

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 2012-09-28
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多