C ++对不同的Sort函数使用相同的Index函数

时间:2015-11-17 23:48:02

标签: c++

我创建了一个小练习程序,用于练习从文件中读取的排序数据。我遇到的问题是,当我想要排序一个不同的特定列(在本例中为第二列)时,我得到了无法转换数据类型的错误。

我的目标是能够找到该列的中位数,最小值和最大值。现在,我知道这是一个数据类型不匹配问题,但我想知道是否有办法绕过它?因为否则我将不得不创建另一个看起来效率很低的minIndex函数。

以下是代码:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>

using namespace std;

void readScore(ifstream & fin, double & x, int & y, string & z);

double median(double arr[], int n);

void swap(int & a, int & b);
int minIndex(double k[], int size, int startIndex);
void selectionSortAll(double k[], int l[], int size);
void selectionSortY(int l[], int size);

struct XYZ
{
    double varx[4];
    int vary[4];
    string varz[4];
};

int main()
{
    double x;
    int y;
    string z;

    ofstream fout;
    ifstream fin;

    fin.open("struct fstream.txt");

    XYZ calcX;
    XYZ calcY;
    XYZ calcZ;

    double scoreSumX = 0;
    int scoreSumY = 0;
    for (int i = 0; i < 4; i++)
    {
        readScore(fin, x, y, z);
        calcY.vary[i] = y;
        calcX.varx[i] = x;
        calcZ.varz[i] = z;
        cout << calcX.varx[i] << " ";
        cout << calcY.vary[i] << " ";
        cout << calcZ.varz[i] << endl;
        /*scoreSumX += calcX.varx[i];
        scoreSumY += calcY.vary[i];
        cout << "Current sum: " << scoreSumX << endl;
        if (i >1)
        {
            cout << "Current average: " << scoreSumX / (i + 1) << endl;
        }*/
    }

    cout << "" << endl;

    selectionSortAll(calcX.varx, calcY.vary, 4);

    for (int i = 0; i < 4; i++) {
        cout << calcX.varx[i] << " ";
        cout << calcY.vary[i] << " ";
        cout << calcZ.varz[i] << endl;
    }

    cout << median(calcX.varx, 4);

    fin.close();
    fout.close();

    return 0;
}

void readScore (ifstream & fin, double & x, int & y, string & z)
{
    fin >> x >> y >> z;
}

double median(double arr[], int n)
{
    if (n % 2 == 0)
        return arr[n / 2];
    else
        return arr[n / 2];
}

void swap(int & a, int & b) {
    int temp = a;
    a = b;
    b = temp;
}

int minIndex(double k[], int size, int startIndex) {
    int minI = startIndex;
    for (int i = startIndex; i < size; i++) {
        if (k[i] < k[minI]) {
            minI = i;
        }
    }
    return minI;
}

void selectionSortAll(double k[], int l[], int size) {
    int minI;

    for (int startIndex = 0; startIndex < size; startIndex++) {
        minI = minIndex(k, size, startIndex);
        swap(k[startIndex], k[minI]);
        swap(l[startIndex], l[minI]);
    }
}

void selectionSortY(int l[], int size) {
    int minI;

    for (int startIndex = 0; startIndex < size; startIndex++) {
        minI = minIndex(l, size, startIndex);
        swap(l[startIndex], l[minI]);
    }
}

最后一个函数&#34; selectionSortY&#34;发生错误,因为第一个参数&#34; l&#34;在这种情况下是 int ,但函数中的第一个参数&#34; minIndex&#34;是。我是否必须创建另一个minIndex函数来索引不同的数据类型?

哦,作为参考,输入文件如下所示:

634 423 qwerty
115 935 jkl
968 156 asdf
439 593 iopu

感谢您的时间,非常感谢任何帮助=)

编辑:只是为了澄清,该程序在没有&#34; selectionSortY&#34;功能。 &#34; selectionSortAll&#34;按预期对前两列进行排序。

编辑2:我是编程的新手,所以如果我有点慢,或者如果我直接知道什么是什么,请耐心等待。另外对于实际的作业(比这还要大得多,所以我没有在这里发布),我对我允许使用的内容有所限制,因为这是初学者课程的第一个学期。

1 个答案:

答案 0 :(得分:1)

尝试模板:

template<typename T>
int minIndex(T k[], int size, int startIndex) {
    int minI = startIndex;
    for (int i = startIndex; i < size; i++) {
        if (k[i] < k[minI]) {
            minI = i;
        }
    }
    return minI;
}

Live Demo

顺便说一下,我会考虑更多地依靠<algorithm>STL containersvector来完成你的目标。 Finding the minimum elementfor example