编一个C++程序 创建一个选择排序法的函数模板sort 并在main()执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编一个C++程序 创建一个选择排序法的函数模板sort 并在main()执行相关的知识,希望对你有一定的参考价值。

如题 .

参考技术A 写了两段代码,第一个是用冒泡排序法做的,第二个是快速排序法

#include <iostream>
using namespace std;

//冒泡排序法
template<typename T>
void sort(T *data, int n)

int i, j;
T hold;

for (i = 0; i < n - 1; i++)

for (j = 0; j < n -1; j++)

if (data[j] > data[j+1])

hold = data[j];
data[j] = data[j+1];
data[j+1] = hold;






int main()

int i;
int a[] = 3, 2, 1, 5, 8 ,7;
char b[] = 'b', 'c', 'a', 'p', 'g';
double c[] = 1.2, 2.1, 1.1, 1.0;

sort(a, 6);
for (i = 0; i < 6; i++)
cout << a[i] << " ";
cout << endl;

sort(b, 5);
for (i = 0; i < 5; i++)
cout << b[i] << " ";
cout << endl;

sort(c, 4);
for (i = 0; i < 4; i++)
cout << c[i] << " ";
cout << endl;

return 0;


#include <iostream>
using namespace std;

//快速排序法
template<typename T>
void Quick_sort(T *data_ptr, int left, int right)

int low(left), high(right);
T middle, temp;

middle = data_ptr[(rand()%(right - left + 1)) + left]; //随机产生一个大于等于left且小于等于right的数

do
while ((data_ptr[low] < middle) && (low < right)) //左扫面找出大于middle的数
low++;

while ((data_ptr[high]) > middle && (high > left)) //右扫面找出小于middle的数
high--;

//数据交换
if (low <= high)

temp = data_ptr[low];
data_ptr[low] = data_ptr[high];
data_ptr[high] = temp;
low++;
high--;


while(low <= high); //当下标交错时停止,结束一次排序

//当左边有部分值的时候(left<high),递归左边
if (left < high)
Quick_sort(data_ptr, left, high);

//当右边有部分值的时候(right > low),递归右边
if (right > low)
Quick_sort(data_ptr, low, right);


int main()

int i;
int a[] = 3, 2, 1, 5, 8 ,7;
char b[] = 'b', 'c', 'a', 'p', 'g';
double c[] = 1.2, 2.1, 1.1, 1.0;

Quick_sort(a, 0, 5);
for (i = 0; i < 6; i++)
cout << a[i] << " ";
cout << endl;

Quick_sort(b, 0, 4);
for (i = 0; i < 5; i++)
cout << b[i] << " ";
cout << endl;

Quick_sort(c, 0, 3);
for (i = 0; i < 4; i++)
cout << c[i] << " ";
cout << endl;

return 0;
本回答被提问者和网友采纳

模板化成员函数不能从同一个类调用非模板化成员函数,C++

【中文标题】模板化成员函数不能从同一个类调用非模板化成员函数,C++【英文标题】:Templated member functions cannot call non-templated member function from same class, C++ 【发布时间】:2013-10-02 21:07:53 【问题描述】:

我编写了一个类来处理我的程序中的所有随机数生成。我正在尝试在该类中实现函数,这些函数采用向量或指向数组的指针并随机选择其中一个元素。我正在为这些函数使用模板,因此它们可以从包含任何类型的数组或向量中进行选择。

但是,在编译 (MSVC 2012) 时,两个模板函数都出现“错误 C3861:'double0to1': identifier not found”错误。 double0To1 是该类的公共成员函数。

在 rng.h 中:

#ifndef RNG_H
#define RNG_H

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_real_distribution.hpp>
#include <boost/random/variate_generator.hpp>
#include <vector>

class RNG

public:
    RNG(int seedIn);
    ~RNG(void);

    double double0To1();
    int positiveIntLessThan(int upperBound);

    template<class T> T* randomObjectInVector(std::vector<T*> vectorToChooseFrom);
    template<class T> T* randomObjectInArray(T** arrayToChooseFrom, int size);

private:
    int seed;
    boost::random::uniform_real_distribution<double> *distribution0To1;
    boost::mt19937 generator;
    boost::random::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<double>> *mersenne0To1;
;

template<class T> T* RNG::randomObjectInVector(std::vector<T*> vectorToChooseFrom)

    double randNum=double0to1();
    double step=1/vectorToChooseFrom.size();

    int indexToTake=floor(randNum/step);

    return vectorToChooseFrom[indexToTake];


template<class T> T* RNG::randomObjectInArray(T** arrayToChooseFrom, int size)

    double randNum=double0to1();
    double step=1/size;

    int indexToTake=floor(randNum/step);

    return &((*arrayToChooseFrom)[indexToTake]);

在 rng.cpp 中:

#include "stdafx.h"
#include "RNG.h"


RNG::RNG(int seedIn)

    seed=seedIn;
    generator.seed(seed);
    distribution0To1=new boost::random::uniform_real_distribution<double>(0, 1);
    mersenne0To1=new boost::random::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<double> >(generator, *distribution0To1);


RNG::~RNG(void)

    delete distribution0To1;


double RNG::double0To1()

    return (*mersenne0To1)();


int RNG::positiveIntLessThan(int upperBound)

    double randomValue=double0To1();

    return int(upperBound*randomValue);

【问题讨论】:

【参考方案1】:

由于区分大小写,您只是有一个错字。

函数调用double0To1,而你调用double0to1()

注意函数定义中的大写T。 C++ 中的标识符区分大小写。

【讨论】:

现在踢自己。我已经盯着这个看了一段时间,我猜只是需要一双新鲜的眼睛。为您提供简单的代表:)

以上是关于编一个C++程序 创建一个选择排序法的函数模板sort 并在main()执行的主要内容,如果未能解决你的问题,请参考以下文章

C++ 函数重载,函数模板和函数模板重载,选择哪一个?

今天编的一个C++程序

C++ 提高教程 函数模板-函数模板案列

八大数据排序法冒泡排序法的图形理解和案例实现 | C++

八大数据排序法希尔排序法的图形理解和案例实现 | C++

c++模板--让偷懒成为常态