微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SelectionSort 模板函数不适用于数组

如何解决SelectionSort 模板函数不适用于数组

我有一个模板函数,它对可索引对象执行基于索引的选择排序。 IndexedContainer 必须支持 operator[]size(),例如std::vector。容器元素必须支持 operator<operator=

我的函数必须接受任何 std::vector 或数组并按升序对其进行排序。

函数有效但仅适用于向量,因为我使用的是 size() 函数。我无法在我的函数支持 operator[],因为 size() 函数不适用于数组。

#include <iostream>
#include <vector>

template <typename IndexedContainer>
void SelectionSort(IndexedContainer &values) {
    // Todo
    int temp;
    for(unsigned int i = 0; i < values.size(); i++){
        for(unsigned int j = i; j > 0; j--){
            if(values[j] < values[j-1]){
                temp = values[j];
                values[j] = values[j-1];
                values[j-1] = temp;
            }
        }
    }
}

int main() {
    std::vector<char> data = {'a','4','b','2','c','1'};
    std::vector<int> data3 = {1,5,6,8,10,2};
    //std::vector<std::string> data4 = {"1d23","3v4f","0878"};
    char data2[] = "a3b4c1d2";
    SelectionSort(data);
    SelectionSort(data2);
    SelectionSort(data3);
    for(auto i: data){
        std::cout<<i<<" ";
    }
    std::cout<<'\n';
    std::cout<<data2<<'\n';

    for(auto j: data3){
        std::cout<<j<<" ";
    }
    return 0;
}

解决方法

c++17 引入了 std::size,这是一个免费函数,它使用 size 成员函数和数组封装事物的大小。如果您没有 c++17,那么方便地该链接包含一个实现。关键是这种专业化:

template <class T,std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}

复制它,并在您的实现中使用 size 免费函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。