2012-12-18 200 views
2

我可以在以下以肖恩的形式進行分配,而不需要創建新的分配功能爲整個結構向量分配一個結構元素?

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

你似乎使用C++ 11了。你自己實現了免費的開始/結束功能?什麼是'結構'BTW? – Nawaz

+0

''begin/end''只是爲了提高可讀性,我使用VS2008 – fogbit

回答

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

+0

我只是做了一些修改,因爲你有問題。 – 111111

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); 
} 
+0

謝謝你的回答。如果我只是使用元素的偏移量呢?像''std :: fill(&v [0] + offsetoff(element),&v [0] + offsetoff(element)+ N,value)''?我有一個「POD」結構。 – fogbit

+0

@fogbit:這是行不通的。想想「fill」是如何工作的,以及你傳遞給它的東西。 – Nawaz