【问题标题】:C++ creating a Templatized function to sort both int and stringsC++ 创建一个模板化函数来对 int 和字符串进行排序
【发布时间】:2021-08-15 03:40:41
【问题描述】:

我正在使用模板函数,并希望创建一个同时对整数和字符串进行排序的函数。我已经设法让它与整数一起工作,但在字符串方面遇到了麻烦。

这是我目前的代码。


#include <iostream>
#include <string>
using namespace std;


template <class T>
void print(T arr[], int n);
template <class T>
void swap(T arr[], int i, int j);
template <class T>
T getSmallest(T arr[], int start, int end);
template <class T>
void selectionSort(T arr[], int n);



int main()
{
    int n = 10;
    int iarr[] = { 3,5,9,2,1,7,8,4,0,6 };
    selectionSort<int>(iarr, n);
    print<int>(iarr, n);

    cout << endl;
    string sarr[] = { "skunk", "hedgehog", "aardvark", "zebra", "rat", "cat", "hippopotamus", "hamster", "manatee", "red panda" };
    selectionSort<string>(sarr, n);
    print<string>(sarr, n);
    cout << endl;

    return 0;
}




// PRE: length of arr = n
// PARAM: arr = array of integers of length n
// POST: prints arr[0:n]
template <class T>
void print(T arr[], int n) {
    for (int i = 0; i < n; i++) {
        cout << arr[i] << endl;
    }
}


// PRE: i, j < length of arr
// PARAM: arr = array of integers of length n, i and j are indexes
// POST: swaps arr[i] with arr[j]
template <class T>
void swap(T arr[], int i, int j) {
    T temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}


// PRE: 0 <= start < end <= length of arr
// PARAM: arr = array of integers
//        start = start index of sub-array
//        end = end index of sub-array + 1
// POST: returns index of smallest value in arr{start:end}
template <class T>
T getSmallest(T arr[], int start, int end) {
    T smallest = start;
    for (int i = start + 1; i < end; ++i) {
        if (arr[i] < arr[smallest]) {
            smallest = i;
        }
    }
    return smallest;
}


// PRE: length of arr = n
// PARAM: arr = array of integers of length n
// POST: sorts arr in ascending order
template <class T>
void selectionSort(T arr[], int n) {
    for (int i = 0; i < n - 1; ++i) {
        int smallest = getSmallest(arr, i, n);
        swap(arr, i, smallest);
    }
}

我知道我需要找到某种方法让“最小”能够以某种方式适用于字符串。但简单地将它从 int 转换为模板 T 是行不通的。有什么建议吗?

【问题讨论】:

  • “不工作”是什么意思?你得到一个编译器错误吗?
  • @stackoverflow.com/users/4117728/463035818-is-not-a-number 我从编译器中得到以下一些错误“ main.cpp: In instantiation of 'void selectionSort(T*, int) [with T = std::__cxx11:: basic_string]': main.cpp:27:31: 从这里需要 main.cpp:82:7: 错误:在初始化 int 最小时无法将 'std::__cxx11::basic_string' 转换为 'int' = getSmallest(arr, i, n); ^~~~~~~~"
  • 请编辑问题以包含编译器输出,然后删除评论。

标签: c++ string sorting templates


【解决方案1】:

这个函数

template <class T>
T getSmallest(T arr[], int start, int end) {
    T smallest = start;
    for (int i = start + 1; i < end; ++i) {
        if (arr[i] < arr[smallest]) {
            smallest = i;
        }
    }
    return smallest;
}

具有无效的返回类型。对于 std::string 类型的对象数组,它的返回类型为 std::string。

应该是这样的

template <class T>
int getSmallest(T arr[], int start, int end) {
    int smallest = start;
    for (int i = start + 1; i < end; ++i) {
        if (arr[i] < arr[smallest]) {
            smallest = i;
        }
    }
    return smallest;
}

不要忘记更改函数模板声明

template <class T>
int getSmallest(T arr[], int start, int end)

【讨论】:

  • 我试过了,现在我发现编译器问题被认为是重载? main.cpp:在'void selectionSort(T *,int)[with T = int]'的实例化中:main.cpp:22:28:从这里需要main.cpp:82:29:错误:调用重载'getSmallest (int*&, int&, int&)' 是模棱两可的 int minimum = getSmallest(arr, i, n); ~~~~~~~~~~~^~~~~~~~~~~ 那我错过了什么?
【解决方案2】:

您已将int 更改为T

template <class T>
T getSmallest(T arr[], int start, int end) {
    T smallest = start;
    for (int i = start + 1; i < end; ++i) {
        if (arr[i] < arr[smallest]) {
            smallest = i;
        }
    }
    return smallest;
}

如果您使用int 作为索引,那么smallest 应该是int,返回类型应该是int,而不是T。其实我建议使用size_t 索引(除非你想传递迭代器):

template <class T>
size_t getSmallest(T arr[], size_t start, size_t end) {
    size_t smallest = start;
    for (size_t i = start + 1; i < end; ++i) {
        if (arr[i] < arr[smallest]) {
            smallest = i;
        }
    }
    return smallest;
}

【讨论】:

    【解决方案3】:

    你几乎拥有它。

    唯一不同的是getSmallest() 会返回一个索引,而不管T 是什么。所以那部分不应该被模板化。

    template <class T>
    int getSmallest(T arr[], int start, int end) {
        int smallest = start;
    
    

    【讨论】:

    • 我试过了,现在我发现编译器问题被认为是重载? main.cpp:在'void selectionSort(T *,int)[with T = int]'的实例化中:main.cpp:22:28:从这里需要main.cpp:82:29:错误:调用重载'getSmallest (int*&, int&, int&)' 是模棱两可的 int minimum = getSmallest(arr, i, n); ~~~~~~~~~~~^~~~~~~~~~~ 那我错过了什么?
    猜你喜欢
    • 2013-06-01
    • 2016-08-28
    • 1970-01-01
    • 2015-07-27
    • 2013-04-17
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多