为整个结构向量分配一个结构元素?

时间:2012-12-18 15:18:24

标签: c++ stl functional-programming assign

我可以在下指定shawn而不创建新的分配函数吗?

struct S
{
  int     one;
  double  two;
}

vector< S > v( 10 );

std::transform( begin( v ), end( v ), begin( v ), /*some how bind S::two to 10., for example*/ );

结果:所有v元素都有S:two == 10,S::one具有std::transform之前的值

没有C ++ 11,允许加速。

2 个答案:

答案 0 :(得分:2)

我写了一个通用的setter,你可以设置 结构的任何成员。

例如,如果您想将成员two设置为特定值10.0,那么您必须写下这个:

std::transform(v.begin(), v.end(), v.begin(), make_setter(&S::two, 10.0));

你已经完成了。

以下是settermake_setter的实施:

template<typename C, typename M>
class setter
{
     M C::*m_member;   
     M m_value;

public:

     setter(M C::*member, M value) : m_member(member), m_value(value) {}

     C operator()(C item)
     {
         item.*m_member = m_value;
         return item;
     }
};

template<typename C, typename M>
setter<C, M> make_setter(M C::*member, M value) 
{
    return setter<C,M>(member, value);
}

答案 1 :(得分:1)

struct set_two {
    double v;
    set_two(double v_) : v(v_) { }
    S operator()(S s) const { 
        s.two=v;
        return s;
    }
};

std::transform( begin(v), end(v), begin(v), set_two(10.0) );

虽然我假设您拥有beginend,否则它来自boost或C ++ 11