在向量c ++中排序元素

时间:2013-11-11 09:27:46

标签: c++

我有一个文本文件points.txt

由Points / NotPoints,X,Y

格式化
Points, [3, 3]
NotPoints, [0, 0]
Points, [4, 4]
NotPoints, [0, 0]

我想要做的是从文本文件中检索X值并将其放入向量中 按ASC或DSC顺序对X值进行排序。

我为我的问题找到了类似的帖子

www.stackoverflow.com/questions/7102246/sorting-a-vector-of-objects-in-c# =

但问题是,当我尝试在main.cpp上执行此操作时,

sort(pointsVector.begin(), pointsVector.end(),sortOrder()) ;

它显示了一个错误,非静态成员sortOrder在Points类型的多个基类子对象中找到。

请参阅下面的代码,了解我的实施情况。

我的任务的一些要求,

I must initialize int x as protected variable as there are other class inheriting it , 
I can't use struct therefore I am using get and set

代码

Points.h

#ifndef __Points__Points__
#define __Points__Points__
#include <iostream>

class Points {
    friend class main;

protected:
     int x;
     int y;

private:
     friend bool sortOrder (const Points & rhs, const Points & lhs);
public:
    Points() {
        x=0;
        y=0;
    };//default Constructor

    Points (int x , int y);
    int getX();
    int getY();

    void setX(int x);
    void setY(int y);

    bool sortOrder (const Point2D & rhs, const Point2D & lhs) {
        return lhs.x < rhs.x;
    }
};
#endif 

Points.cpp

#include "Points.h"

Points::Points(int x , int y) {
    setX(x);
    setY(y);

}

int Points::getX() {
    return x;
}

int Points::getY() {
    return y;
}

void Points::setX(int x)   {
    this->x = x;
}

void Points::setY(int y)   {
    this->y = y;
}

main.h

 #ifndef Points_main_h
 #define Points_main_h
 #include <iostream>
 #include "Points.h"
 #include <vector>

class main : public Points  {

private:
    int input;
    std::string type,line;
    std::string pointX, pointY;
    std::vector<Points> pointsVector;
 public:
    void mainMenu();
    void getPoint2DRecordsFromFile();
};
#endif 

的main.cpp

 #include <iostream>
 #include "main.h"
 #include "Points.h"
 #include <fstream>
 #include <sstream>
 #include <string>
 #include <vector>
 #include <stdio.h>
 #include <algorithm>

class main outputMethod;

void main::getRecordsFromFile() {

    std::ifstream readFile;
    //put your text file name inside the ""
    readFile.open("points.txt");
    if (!readFile.is_open()) {
        std::cout <<" "<< std::endl;
        std::cout << "File Not Found!" << std::endl;
        std::cout <<" "<< std::endl;
    }
    else    {
        while (readFile.good()) {
            while(getline(readFile,line))   {
                std::stringstream iss(line);
                getline(iss, type,',');
                if(type == "Points")  {

                getline(iss, pointX,'[');
                getline(iss, pointX,',');

                getline(iss, pointY ,' ');
                getline(iss, pointY,']');

                Points pointsConsturctor(std::stoi(pointX),std::stoi(pointY));
                pointsVector.push_back(pointsConsturctor);
                }
            }
        }
    }
    readFile.close();

    /*error!
    Non static members sortOrder found in multiple base-class subobjects of type Points*/
    sort(pointsVector.begin(), pointsVector.end(),sortOrder());

    for (int i = 0; i<pointsVector.size(); i++) {
        std::cout << pointsVector[i].getX() << "," << pointsVector[i].getY() << std::endl;
    }  
}


void main::mainMenu() {

    std::cout << "1. Read data " << std::endl;
    std::cout << "2. sort " << std::endl;
    std::cin >> input;

    switch ( input ) {
        case 1:
            std::cout << "In Progress!" << std::endl;
            break;
        case 2:
            getRecordsFromFile();
            break;
        default:
            break;
        std::cin.get();
    }

}

int main()  {
    outputMethod.mainMenu();
}

4 个答案:

答案 0 :(得分:5)

请注意,在课程积分中,您已定义 sortOrder两次(作为友元函数和方法):

friend bool sortOrder (const Points & rhs, const Points & lhs);

bool sortOrder (const Point2D & rhs, const Point2D & lhs) {
    return lhs.x < rhs.x;
}

答案 1 :(得分:2)

由于sortOrder是一个函数,所以

sort(point2DVector.begin(), point2DVector.end(),sortOrder()) ;

您实际上是在尝试调用该函数。由于您未提供所需的参数,因此会出现错误。而只是在没有括号的情况下传递它:

sort(point2DVector.begin(), point2DVector.end(), &Points::sortOrder) ;

另一个错误是它是一个成员函数,并且所有成员函数都有一个隐藏的第一个参数,它是函数中的this指针,所以只是执行上述操作也不起作用。您必须使该功能成为一个独立的功能,或使其成为static成员功能。

答案 2 :(得分:2)

当您将sortOrder实际定义为成员函数时,您宣布friend为朋友。 Points旨在为函数提供对类本身的类的访问权。

此外,两个声明在参数类型上有所不同 - 一个需要两个Point2D,另外两个Point2D - 这个sortOrder类型来自哪里?

所以:

  • sortOrder函数放在类声明之外(或按照Joachim Pileborg的建议使其静态化)
  • 更正参数类型
  • 删除std::sort来电中{{1}}后的括号 - 就像现在一样,您正试图调用该功能。

答案 3 :(得分:2)

当你编写sortOrder()时,编译器认为你正在调用一个函数,但是你真正需要的是一个函数或一个函数(一个类似函数的类)。因此,您可以编写函数或函子或使用lambda表达式。或者在最简单的情况下,您可以将sortOrder设为静态函数,并将其命名为:

sort(point2DVector.begin(), point2DVector.end(),&Points::sortOrder)