从std::向量中的每个结构中选择一个成员到另一个向量中
selecting a single member from each structure in a std::vector into another vector
我有一个Visual Studio 2008 C++项目,我想将该结构类型的向量的一个结构元素复制到一个新向量中。例如:
struct Foo {
int a;
long b;
};
std::vector< Foo > v1;
std::vector< long > v2;
for( std::vector< Foo >::const_iterator it = v1.begin(); it != v1.end(); ++it )
{
v2.push_back( it->b );
}
还有比这更好/更优雅的方式吗?
谢谢,PaulH
在Visual C++2008中,不,这是最"优雅"的。标准库提供了可用于操作容器的算法,但在大多数情况下——尤其是在像这样的简单用例中——它们太麻烦了,无法使用。
C++11将lambda表达式添加到C++中。Visual C++2010和其他C++编译器的最新版本支持此C++11功能。使用lambda表达式,您可以很容易地将transform
算法用于您的任务:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2),
[](Foo const& x) { return x.b; });
如果没有lambda表达式,则必须定义一个函数来从结构中提取b
元素:
long get_b(Foo const& x) { return x.b; }
然后,您可以将此函数与transform
算法一起使用:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2), get_b);
然而,对于像这样的简单用例,这可能会很快导致代码变得笨拙,因为很难将所有相关函数整齐地放在一起。
这实际上取决于"更好"的含义。
如果你的意思是,如果同样的东西可以通过使用模板技巧来编写,那么答案是肯定的:
template<typename C, typename T>
struct MemberGetter
{
T C::*mp;
MemberGetter(T C::*mp) : mp(mp) { }
T operator()(const C& c) { return c.*mp; }
};
struct Foo
{
double dm;
};
...
std::vector<double> x;
std::vector<Foo> y;
std::transform(y.begin(), y.end(),
std::back_inserter(x),
MemberGetter<Foo, double>(&Foo::dm));
在我看来,这比显式循环更糟糕,但它的优点是成员指针(即,您正在复制结构的哪一部分)可以是运行时参数。
如果你需要复制的成员是已知的并且是固定的,那么我认为显式循环是最好的方法(我几乎无法想象使用类似模板的情况,其中成员指针是模板参数)。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 获取向量C++中第一个值和最后一个值的和
- 从多个源构造一个对象,包括一个对象向量
- 为什么一个向量上的多线程操作很慢
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 将一个向量插入另一个向量的某个位置
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 将指向给定子类的指针从一个向量复制到另一个向量
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 紧凑向量一个小的内存足迹向量