2012-06-04 2 views
0

Эй, я пытаюсь преобразовать векторы указателей в объект в другой вектор указателей на другой объект.C++ вектор преобразования указателей

Я дал следующие классы:

class Test; 
class Test2 { 
    public: 
     Test2(Test*); 
} 

Я незнаком о том, как создать функтор. это часть пробного экзамена на экзамены позже на этой неделе, но я запутался в этом вопросе. Следующая ссылка объясняет использование преобразования достаточно хорошо, но моя проблема немного отличается. Любая помощь будет замечательной!

Ссылка: http://www.cplusplus.com/reference/algorithm/transform/

+0

[Что вы пробовали?] (Http://www.whathaveyoutried.com) – Gnosophilon

+0

Хммм, домашнее задание вопрос .... Читали и попытался это понять? http://stackoverflow.com/questions/356950/c-functors-and-their-uses – KayEss

+0

Если вы не знакомы с тем, как создать функтор, почему бы вам не познакомиться с ним (используйте поисковую систему для пример), повторите вашу проблему, и если вы все еще не сможете ее решить из-за особых трудностей, спросите на SO –

ответ

2

Функтор, который является одним перегружает operator(). Таким образом, вы можете определить функтор как:

struct Test2Generator 
{ 
    //this will be called from std::transform 
    Test2* operator()(Test1 *param) const 
    { 
      return new Test2(param); 
    } 
}; 

Затем используйте его как:

std::vector<Test1*> v1; 
//fill v1 

std::vector<Test2*> v2(v1.size()); 

std::transform(v1.begin(), v1.end(), v2.begin(), Test2Generator()); 

В C++ 11, вам не нужно определить функтор, вместо этого вы можете использовать лямбда как:

std::transform(v1.begin(), 
       v1.end(), 
       v2.begin(), 
       [](Test1 *param) { return new Test2(param); }); 
+1

Спасибо за то, что плохо протестируйте его сейчас и пройдите через него –

+1

Кажется, я получил его работу, я буду завтра с моим преподавателем, но очень полезен, и я понимаю это сейчас :) –

+0

Маленькая nitpick: Возможно, лучше не изменять размер ', а только' reserve' и использовать итератор 'std :: back_inserter'. 'resize()' требует инициализации всех элементов в векторе. Это не будет иметь заметного влияния, но нет смысла инициализировать указатели до 0. –

2

призыв к трансформации будет что-то похожее на:

std::vector<Test*> src = ... 
std::vector<Test2*> dst; 
dst.reserve(src.size()); 
std::transform(src.begin(), src.end(), std::back_inserter(dst), MyFunctor()); 

Где MyFunctor() функция объект, который реализует Test2* operator()(Test*):

struct MyFunctor { 
    Test2* operator()(Test*) const { 
     // implementation goes here 
    } 
}; 
Смежные вопросы