2011-01-26 5 views
1

이것은 내 첫 번째 질문입니다. 나는 포기하고 이것을 위해 손으로 감아주는 펑터를 사용할 것이지만, 어떻게해야 할 지 궁금하다. 아래의 고안된 예제는 벡터에있는 모든 벡터의 크기를 Null로 채워서 크기를 9로 조정하기위한 것입니다. 표시된 라인은 MinGW GCC 4.5.0에 많은 템플릿 오류를 발생시킵니다. 여러 다른 순열을 시도했지만, 아래에서 "가장 정확한 것"이라고 생각하는 코드 만 게시했습니다. 그것을 어떻게 써야합니까? 참고, 나는 두 인수 버전의 resize를 유지하려고합니다.for_each 벡터 크기 조정 벡터의 벡터

#include <vector> 
using std::vector; 
#include <algorithm> 
using std::for_each; 
#include <tr1/functional> 
using std::tr1::bind; 
using std::tr1::placeholders::_1; 

int main() { 
vector<vector<void *> > stacked_vector(20); 
for_each(stacked_vector.begin(),stacked_vector.end(), 
    bind(&std::vector<void *>::resize,_1,9,0/*NULL*/)); // voluminous error output 
return 0; 
} 

대단히 감사합니다.

답변

1

오류 출력을 보지 않고 (솔직히 말해서도) 말하기 어렵습니다. 그러나 void* 형식으로 NULL을 전달하십시오 : static_cast<void*>(0). 그렇지 않은 경우 bind에 의해 반환 된 객체는 resize의 두 번째 매개 변수로 int 값을 제공하려고 시도합니다.

+0

Amnon의 대답이 저에게 효과적이었습니다. 사람이 펑터 방법을 찾고, 나는 한 다음 템플릿 클래스 resize_functor { 공개 : \t resize_functor (size_t와 크기, T 값) : size_ (크기), VALUE_ (값) {}; \t 템플릿 void operator() (C & container) { \t \t container.resize (size_, value_); \t} 개인 : \t size_t size_; \t T value_; }; ... for_each (stacked_vector.begin(), stacked_vector.end(), resize_functor (9u, 0)); –

+0

의견에 코드 태그를 추가하는 방법을 알 수 있습니다. –

0

시도해보십시오.

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


int main() 
{ 
    typedef std::vector<int> vec_int; 
    typedef std::vector<vec_int> vec_vec_int; 

    // Do this to make the _1 work 
    using namespace std::placeholders; 

    static const int FIRST_DIM = 5; 
    static const int SECOND_DIM = 10; 
    static const int DEFAULT_VALUE = 66; 

    vec_vec_int v(FIRST_DIM); 

    std::for_each(v.begin(), v.end(), 
     std::bind(&vec_int::resize, _1, SECOND_DIM, DEFAULT_VALUE)); 

    std::cout << v[4][9]; 

    return (0); 
} 

기본값을 지정하지 않으려는 경우에는 필요하지 않습니다.