使用boost copy将struct的成员复制为set container到set容器中

时间:2015-01-12 08:13:08

标签: c++ boost struct

在下面有结构:

struct MixingParts{
int intPart;
double doublePart;
}

和std :: map如下:

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

我发现boost :: copy非常有用,如果你能帮助我只提取struct的整数部分作为上面地图的键并将其插回到std :: set intSet中,我将不胜感激;

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

我只能使用C ++ 98,而且任何其他不那么详细和优化的解决方案都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

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也可以使用。

答案 1 :(得分:1)

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

在C ++ 11中它不那么冗长,但它很难被C ++ 98标准所臃肿。它具有简单和最佳的效率(考虑到数据结构的选择)。