#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); но это все еще не работает