как использовать эту шаблонную функцию c . простой вопрос для начинающих

#c

#c

Вопрос:

Я нашел эту функцию сортировки слиянием, но я не знаю, как ее использовать. пожалуйста, помогите

 #include<iostream>
#include<stdlib.h>
#include<vector>
using namespace std;

template <typename Comparable>
void mergeSort(vector<Comparable*> amp;v)
{
    mergeSortPart(v, 0, v.size() - 1);
}

template <typename Comparable>
void mergeSortPart(vector<Comparable*> amp;v,int first,int last)
{  
    if(first < last)
    {
        int mid = (first   last)/2;
        mergeSortPart(v, first, mid);
        mergeSortPart(v, mid   1, last);
        merge(v, first, mid, last);
    }
}
template <typename Comparable>
void merge(vector<Comparable*> amp;v, int first, int mid,int last)
{
    vector<Comparable*> temp(v.size());
    int first1 = first; int last1 = mid; int first2 = mid   1;
    int last2 = last; int index = first1;
    while((first1 <= last1) amp;amp; (first2 <= last2))
    {
        if(*v[first1]<*v[first2])
            temp[index  ] = v[first1  ];
        else
            temp[index  ] = v[first2  ];
    }
    while(first1 <= last1)
        temp[index  ] = v[first1  ];
    while(first2 <= last2)
        temp[index  ] = v[first2  ];
    for(index = first; index <= last; index  )
        v[index] = temp[index];
}

void main()
{  
    vector<int> arr (20);
    for(int i=0;i<20;i  )
        arr[i]=i;
    mergeSort<int>(arr);
}
  

В main функции я попытался объявить массив из 6 элементов и вызвал mergeSort шаблонную функцию, но это выдает ошибку компиляции:

Ошибка 1 ошибка C2664: 'mergeSort' : не удается преобразовать параметр 1 из 'std::vector<_Ty>' в 'std::vector<_Ty,_Ax> amp;'

Я не очень знаком с функциями шаблонов, поэтому, если бы кто-нибудь мог показать мне, как использовать эту функцию, это было бы приятно для меня

Спасибо

Комментарии:

1. Если это домашнее задание, вы должны пометить его как таковое.

2. и если это не так, взгляните на std::stable_sort()

3. При работе с ошибками шаблона важно прочитать сообщение об ошибке целиком. В частности, он, вероятно, содержал то, что _Ty и _Ax было в этом конкретном экземпляре.

4. привет .. я не очень разбираюсь в c , пожалуйста, подскажите мне, как использовать эту функцию. vector<int *> arr (20); for(int i=0;i<20; i ) *arr[i]= i; mergeSort<int>(arr); я пытался добавить указатель, но он по-прежнему выдает исключение во время выполнения.

Ответ №1:

Поскольку параметр mergeSort равен vector<Comparable*> , он может сортировать только векторы указателей, а не векторы целых чисел или других объектов.

Комментарии:

1. Здесь Comparable параметр шаблона, поэтому используется только любой тип. Проблема в том, что функция указана как принимающая вектор Comparable* , а не Comparable . Это означает, что фактическим параметром должен быть вектор указателей на объекты, которые должны быть отсортированы.

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

3. Я узнал об этом давным-давно, поэтому не знаю ни одного текущего руководства. Этот пример сортировки слиянием кажется очень специализированным, поэтому, возможно, с него не стоит начинать. Если вы хотите отсортировать вектор целых чисел или другие объекты, которые не являются указателями, у вас есть std::sort и std::stable_sort для этого.

4. да .. этот действительно кажется другим. vector<int *> arr (10); for (int i=0; i<10; i ) *arr [i]= i; mergeSort<int>(arr); я пробовал подобным образом, и это не вызвало никакой ошибки компилятора, но вызвало исключение во время выполнения. пожалуйста, скажите мне, как обойти это.

5. в моем приложении я не могу использовать встроенные функции сортировки, такие как std::sort или std::stable_sort. вот почему я начал искать эту функцию. мне сказали, что это идеально подходит для моих требований, поэтому, пожалуйста, подскажите мне, как это использовать…

Ответ №2:

Вы пропустили самую важную часть сообщения об ошибке: соответствующие типы _Ty , которые в одном случае были бы int , а в другом int* .

template<typename Comparable> mergeSort принимает vector<Comparable*>amp; аргумент.

Вы явно указываете int for Comparable и передаете vector<int> , тогда как для этого требовался бы vector<int*> .

Комментарии:

1. привет, ильджарн, я новичок в c , не могли бы вы показать правильный способ его использования, пожалуйста.

2. хорошо .. я попробовал этот вектор<int *> arr (20); для (int i=0; i<20; i ) *arr [i]= i; Сортировка слиянием <int>(arr); но это все еще не работает