【问题标题】:Setting a member of struct using boost lambda使用 boost lambda 设置结构的成员
【发布时间】:2013-01-17 09:08:59
【问题描述】:

我正在尝试使用与v 中相同的值创建vector<Wrap>。我试过下面的组合,没有用!

using namespace std;

struct Wrap
{
  int data;
  //Other members
};

int main()
{
  int a[10] = {2345,6345,3,243,24,234};
  vector<int> v(&a[0],&a[10]);
  Wrap w;
  //Populate other members of w
  vector<Wrap> vw;
  using namespace boost::lambda;
  //transform(v.begin(),v.end(), back_inserter(vw), (bind(&Wrap::data,&w,_1), boost::lambda::constant(w)));
  //transform(v.begin(),v.end(), back_inserter(vw), bind(&Wrap::data,&w,_1), boost::lambda::constant(w));
  //transform(v.begin(),v.end(), back_inserter(vw), ((w.data = _1), boost::lambda::constant(w)));
  //transform(v.begin(),v.end(), back_inserter(vw), ((w.data = _1), w));
  cout << vw.size() << endl;
  BOOST_FOREACH(Wrap w, vw)
  {
    cout << w.data << endl;
  }
}

注意:目前还不能使用 C++11

更新 任何适用于 C++03 的干净解决方案都可以。不需要使用 boost lambda

【问题讨论】:

  • 这是一个 XY 问题吗?您的目标是创建vector&lt;Wrap&gt; 还是让boost::lambda 工作?
  • 创建一个vector&lt;Wrap&gt;

标签: c++ boost c++03 boost-lambda


【解决方案1】:

使用std::transform() 并指定一个二元运算函数。例如:

#include <iostream>
#include <vector>
#include <algorithm>

struct Wrap
{
    int data;
};

Wrap set_data(int a_new_data, Wrap a_wrap)
{
    a_wrap.data = a_new_data;
    return a_wrap;
}

int main()
{
    int a[10] = { 2345, 6345, 3, 243, 24, 234 };
    const size_t A_SIZE = sizeof(a) / sizeof(a[0]);
    std::vector<Wrap> vw(A_SIZE);

    std::transform(a, a + A_SIZE, vw.begin(), vw.begin(), set_data);

    std::cout << vw[0].data << ','
              << vw[1].data << ','
              << vw[5].data << ','
              << vw[9].data << '\n';
    return 0;
}

http://ideone.com/DHAXWs 上查看演示。

【讨论】:

  • 谢谢。但我试图避免创建一个单独的函数。看起来这是不可能的。所以我会接受这个解决方案
【解决方案2】:

你应该为Wrap定义一个构造函数:

struct Wrap
{
  Wrap(int data): data(data) {}
  int data;
};

然后你可以简单地这样做:

transform(v.begin(),v.end(), back_inserter(vw), constructor<Wrap>());

constructor 来自boost/lambda/construct.hpp,并将构造函数包装为函数对象。

【讨论】:

  • 谢谢。但在我的真实用例中。我已经有一个填充了一些值的结构。我只想复制结构并更改其中一个成员
  • 您必须编写一个函数来执行此操作,因为更改成员时无法返回修改后的结构。
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2019-04-15
相关资源
最近更新 更多