【问题标题】:assign an element of a structure for whole vector of structures?为结构的整个向量分配结构的元素?
【发布时间】:2012-12-05 20:08:15
【问题描述】:

我可以在下面不创建新的分配函数进行分配吗?

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,允许升压。

【问题讨论】:

  • 您似乎已经在使用 C++11。您自己实现了免费的开始/结束功能? structureBTW 是什么?
  • begin / end 只是为了提高可读性,我使用VS2008

标签: c++ stl functional-programming assign


【解决方案1】:

我写了一个通用的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);
}

【讨论】:

  • 感谢您的回答。如果我只使用元素的偏移量怎么办?喜欢std::fill( &amp;v[0] + offsetoff(element), &amp;v[0] + offsetoff(element) + N, value )?我有一个POD 结构。
  • @fogbit:那行不通。想想fill 是如何工作的,以及你传递给它的内容。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2020-12-22
    • 1970-01-01
    相关资源
    最近更新 更多