将单个成员从向量A分配给向量B的智能方法

时间:2014-08-17 12:10:35

标签: c++ c++11 stl lambda

这是我正在使用的一段代码,我想知道在C ++ 11中是否有一种更优雅的方式 -

基本上vector_a被复制到vector_b,然后稍加修改,然后返回vector_b

向量元素属于类Point,它基本上是(省略构造函数和一堆方法):

class Point {
    double   x,
             y,
             z;
};

理想情况下,我很乐意将会员zvector_a转移到vector_b到类似一两行但不能提出一种优雅的方式这样做。

欢迎任何建议!

auto localIter = vector_a.begin();
auto outIter = vector_b.begin();
while (localIter != vector_a.end() && outIter != vector_b.end())
{
    outIter->z = localIter->z;
    localIter++;
    outIter++;
}

4 个答案:

答案 0 :(得分:4)

您可以使用transform()

std::transform (vector_a.begin(), vector_a.end(), vector_b.begin(), vector_a.begin(), [](Elem a, Elem b) { a->z = b->z; return a; });

Elem是一种向量元素。

答案 1 :(得分:3)

由于向量具有随机访问迭代器(使用std::next有效),那么我将按以下方式编写代码

auto it = vector_a.begin();

std::for_each( vector_b.begin(), 
               std::next( vector_b.begin(), 
                          std::min( vector_a.size(), vector_b.size() ) ),
               [&it] ( Point &p ) { p.z = it++->z; } );

答案 2 :(得分:2)

部分副本实际上只是元素的转换(许多中的一个),因此std::transform非常适合。

与许多处理多个序列的算法一样,您必须小心容器的界限;在这种特殊情况下,由于vector_b只接收内容,最简单的方法是开始为空并随时调整其大小。

因此,最后,我们得到:

vector_b.clear();

std::transform(vector_a.begin(),
               vector_a.end(),
               std::back_inserter(vector_b),
               [](Elem const& a) { Elem b; b.z = a.z; return b; });

transform可能是标准库中最通用的算法(例如,它可以模仿copy),因此您应该仔细考虑,然后在达到它之前存在更专业的算法。然而,在这种情况下,它恰好适合。

答案 3 :(得分:0)

我很想做一些像这样的事情:

#include <vector>

struct info
{
    int z;
};

int main()
{
    std::vector<info> a = {{1}, {2}, {3}};
    std::vector<info> b = {{4}, {5}};

    for(size_t i(0); i < a.size() && i < b.size(); ++i)
        b[i].z = a[i].z;
}