2011-01-26 3 views
1

Это мой первый вопрос. Я сдался и буду использовать для этого ручную работу, но мне любопытно, как это должно быть сделано. Надуманный пример ниже предназначен для изменения размеров всех векторов в векторе размером 9, путем заполнения их нулями. Указанная строка заставляет MinGW GCC 4.5.0 вызывать множество ошибок шаблонов. Я пробовал несколько разных перестановок, но только разместил код, который, по моему мнению, «ближе всего подходит» ниже. Как это должно быть написано? Обратите внимание: я хочу сохранить двунаправленную версию изменения размера.for_each bind vector of vector resize

#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

Трудно сказать, не видя выход ошибки (и, откровенно говоря, даже с ней). Однако попробуйте передать NULL как void* тип: static_cast<void*>(0). В противном случае объект, возвращаемый bind, пытается присвоить значение int в качестве второго параметра resize.

+0

Ответ Амнона сработал для меня. Для тех, кто ищет функтор подход, я сделал следующее: шаблон класса resize_functor { общественность: \t resize_functor (размер size_t, значение Т): size_ (размер), value_ (значение) {}; \t template void operator() (C & container) { \t container.resize (size_, value_); \t} частный: \t размер_t размер_; \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); 
} 

Если вы не хотите указывать значение по умолчанию, вам не нужно.