2015-06-16 3 views
-1

В приведенном ниже коде strArray представляет собой массив строк, а vec содержит соответствующий идентификатор каждой строки. Я хочу сортировать идентификаторы в vec на основе строк в strArray.Как написать функцию Comp в sort() из C++ STL

Как я могу спроектировать функцию Comp в сортировке?

class myClass 
{ 
public: 
     int V; 
     vector<int> vec; 
     string* strArray; 

     myClass(int v); 
     void myFunc(); 
} 

myClass::myClass(int v, vector<int> vec1) 
{ 
    V = v; 
    strArray = new string[v]; 
    vec.swap(vec1) 
} 

void myClass::myFunc() 
{ 
    //.... 

    for(i = 0; i<V; i++) 
     strArray[i] = GenerateString(vec[i]);// GenerateString() can return a string. 

    sort(vec.begin(), vec.end(), Comp);// sort vec based on strArray,how to design the Comp funtion? 

    //.... 
} 

main() 
{ 
    int myints[] = {32,71,12,45,26,80,53,33}; 
    vector<int> myvector (myints, myints+8); 

    myClass obj(8, myvector); 

    obj.myFunc(); 

    return 0; 

} 
+1

Это, кажется, сломанный дизайн. Учитывая, что вы разорвали код на странице 'std :: sort' в' cplusplus', вы уже явно видели документы. Функция сортировки работает с элементами в контейнере. Функция сравнения принимает две переменные - это не подходит для того, что вы пытаетесь сделать. Как насчет того, чтобы вы сохраняли вектор структур? Каждая структура может содержать строку и целое число. Затем функция сравнения просто сравнивает целочисленный элемент структуры. – enhzflep

+0

Hi enhzflep, я думаю, вы правы, спасибо! – Tao

ответ

3

Изменить элемент string* strArray; к std::pair<std::string, int> strArray;, изменить распределение strArray = new std::pair<std::string, int>[v]; и внести следующие изменения в вашем myFunc

void myClass::myFunc() 
{ 
    //.... 

    for(i = 0; i<V; i++) 
     strArray[i] = make_pair(GenerateString(vec[i]), vec[i]);// GenerateString() can return a string. 

    sort(vec.begin(), vec.end()); 
    std::transform(
     strArray, 
     strArray + V, 
     vec.begin(), 
     [](const std::pair<std::string, int> &p) -> int { return p.second; } 
    ); 

    //.... 
} 

В этом коде мы пару или пару номер (vec[i]), создавший строку и сортировать массив. Теперь, используя std::transform, число копируется обратно в vec

От комментария

Если вы не понимаете функцию лямбда, вы также можете написать функцию в другом месте и передать его в качестве четвертого аргумента в std::transform

static int fetch_int_from_pair(const std::pair<std::string, int> &p) { 
return p.second; 
} 
... 
td::transform(
     strArray, 
     strArray + V, 
     vec.begin(), 
     fetch_int_from_pair 
    ); 
+0

Hi Mohit, Можете ли вы объяснить мне следующий код? Благодаря! "[] (const std :: pair & p) -> int {return pi;}" – Tao

+0

@Jessica, это [лямбда] (http://en.cppreference.com/w/CPP/язык/лямбда). В основном это небольшая встроенная функция для извлечения второго элемента пары. (Я подозреваю, что здесь должно быть p.секунда) – shuttle87

+0

@ shuttle87 Спасибо, исправлено –

Смежные вопросы