使用提升复制将结构成员作为键映射复制到集合容器中

copy member of struct as key map into set container using boost copy

具有以下结构:

struct MixingParts{
int intPart;
double doublePart;
}

和std::map如下:

std::map<MixingParts, std::vector<int> > MixingMap;

我发现 boost::copy 非常有用,如果您能帮助我仅提取结构的整数部分作为上述映射的键并将其插入回 std::set intSet,我将不胜感激;

boost::copy(MixingMap | boost::adoptors::map_keys(.....*Is it possible to use bind here?*...), std::inserter(intSet, intSet.begin())

我只能使用 C++98,也欢迎任何其他不那么冗长和优化的解决方案。

for (MixingMap::const_iterator it = mm.begin(); it != mm.end(); ++it)
    intSet.insert(it->first.intPart);

在 C++11 中它会不那么冗长,但在 C++98 标准中它几乎不会臃肿。而且它简单且效率最高(考虑到数据结构的选择)。

boost::transform(mm, std::mem_fn(&MixingParts::intPart), 
    std::inserter(intSet, intSet.begin())));

或使用 copy/copy_rangetransformed 适配器

这是一个集成的实时示例:

Live On Coliru

#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
#include <iostream>

struct MixingParts{
    int intPart;
    double doublePart;
};

using boost::adaptors::transformed;

int main() {

    std::vector<MixingParts> v { { 1,0.1 }, {2, 0.2}, {3,0.3} };

    boost::copy(v | transformed(std::mem_fn(&MixingParts::intPart)),
            std::ostream_iterator<int>(std::cout, " "));
}

版画

1 2 3 

boost::mem_fn也可以用。