这是我正在使用的一段代码,我想知道在C ++ 11中是否有一种更优雅的方式 -
基本上vector_a
被复制到vector_b
,然后稍加修改,然后返回vector_b
。
向量元素属于类Point
,它基本上是(省略构造函数和一堆方法):
class Point {
double x,
y,
z;
};
理想情况下,我很乐意将会员z
从vector_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++;
}
答案 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;
}