使用自定义类的std :: sort错误

时间:2016-03-30 02:49:50

标签: c++ sorting

我查看了stackoverflow并添加了一个重载运算符,希望它可以使用sort。虽然我仍然得到一个错误的爆炸声,说出排序错误。

代码:

#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <algorithm>

class Student
{
private:
  std::string name_;
  int number_;
  std::vector<int> grades_;
  const int num_courses_;

  static std::string gen_name() {
    return std::to_string(rand());
  }
  static int gen_number() {
    return rand() % (201600000 - 201100000 + 1) + 201100000;
  }
  static int gen_grade() {
    return rand() % (100 - 70 + 1) + 70;
  }
  double compute_average() {
    int marks = 0;
    int count = 0;
    for (std::vector<int>::iterator i = grades_.begin(); i != grades_.end(); i++, count++){
      marks += *i;
    }
    return static_cast<double>(marks) / count;
  }

public:
  Student() : name_(gen_name()), number_(gen_number()), num_courses_(5)
  {
    for (int i = 0; i < num_courses_; ++i) {
      grades_.push_back(gen_grade());
    }
  }

  double getAvg() {
    return compute_average();
  }
  friend std::ostream& operator<<(std::ostream& os, Student& s) {
    os << "Name = " << s.name_ << "\tNumber = " << s.number_ << "\tAvg = " << s.compute_average();
    return os;
  }

  std::string getName() {
    return name_;
  }
  void print_grades(std::ostream& os) const
  {
    for (int i = 0; i < num_courses_; ++i) {
      os << grades_[i] << ", ";
    }
  }
  bool operator < (const Student& str) const
  {
    return (name_ < str.name_);
  }
};


int main(int argc, char ** argv) {
  srand(time(NULL));
  if (argc == 2){
    int numbOfStudents = atoi(argv[1]);
    std::vector<Student> studentVec;
    for (int i = 0; i < numbOfStudents; i++){
      studentVec.push_back(Student());
    }

    std::sort(studentVec.begin(), studentVec.end());
    for (std::vector<Student>::iterator xi = studentVec.begin(); xi != studentVec.end(); xi++) {
      std::cout << *xi << std::endl;
    }

  }
  else{
    std::cout << "Usage: " << argv[0] << " {numb} " << std::endl;
  }
  return 0
}

当我运行sort时出现错误(我知道它是排序的,因为如果我发表评论,它可以正常工作)。使用错误代码

In file included from /usr/include/c++/4.9/algorithm:62:0,
             from main.cpp:5:
/usr/include/c++/4.9/bits/stl_algo.h: In instantiation of ‘void   std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’:
/usr/include/c++/4.9/bits/stl_algo.h:1884:70:   required from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’
/usr/include/c++/4.9/bits/stl_algo.h:1970:55:   required from ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’
/usr/include/c++/4.9/bits/stl_algo.h:4685:72:   required from ‘void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >]’
main.cpp:79:50:   required from here
/usr/include/c++/4.9/bits/stl_algo.h:1851:17: error: use of deleted function ‘Student& Student::operator=(Student&&)’
    *__first = _GLIBCXX_MOVE(__val);

我之前搜索过,这有助于我得到添加'&lt;'的结果超载,虽然我仍然得到一个错误。任何人都可以帮助指出错误在哪里?谢谢。 (我用g ++编译--std = c ++ 11)

1 个答案:

答案 0 :(得分:2)

成员变量const int num_courses_;是const,这意味着它必须在构造函数的初始化列表中设置。

num_courses_不能由复制赋值运算符Student& Student::operator=(Student&&)设置,因此它会阻止编译器为该类生成复制赋值运算符。由于没有可用的复制赋值运算符,并且std :: sort函数需要它才能工作,编译失败并且抱怨复制赋值运算符不可用。

只需删除const并将变量声明为int num_courses_,您的代码即可运行。