2012-12-18 3 views
2

새로운 양도 기능을 사용하지 않고 아래에 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

당신은 C++ (11) 이미를 사용하는 것 : 여기

settermake_setter의 구현입니다. 무료 begin/end 함수를 직접 구현 했습니까? 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 그렇지 않으면 부스트에서 나 C++ (11)

+0

나는 문제가 발생했을 때 약간의 수정 작업을했습니다. – 111111

2

난 당신이구조체의 멤버를 설정 수있는 사용하여 일반 setter을 썼다 때문에 당신이 소유하고 있습니다 . 당신이 특정 값 10.0에 멤버 two을 설정하려면

는 예를 들어, 당신은이를 작성해야 :

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

하면됩니다.

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

해답을 가져 주셔서 감사합니다. 요소의 오프셋을 사용하면 어떨까요? & v [0] + offsetoff (element) + N, value)와 같이''std :: fill (& v [0] + offsetoff (element) 나는''POD'' 구조를 가지고 있습니다. – fogbit

+0

@ fogbit : 작동하지 않습니다. '채우기'가 어떻게 작동하는지, 그리고 당신이 그것을 어떻게 지나가고 있는지 생각해보십시오. – Nawaz