"Debug assertion failed" 这种有什么问题?它应该按年份对包含电影对象的动态列表进行排序


Debug Assertion Failed!
Program C:WINDOWSSYSTEM32MSVCP140D.dll
File: c: program files (x86)microsoft visual studio 14.0vcincludealgorithm
Line: 2783
Expression: invalid iterator range

这种有什么问题?它应该按年份对包含电影对象的动态列表进行排序。

bool cmp(Movie &m1, Movie &m2) {
return m1.getYear() - m2.getYear() < 0;
}
void Controller::sortByYear() {
std::sort(this->repo.getMovies().getAllElems(), this->repo.getMovies().getAllElems() + this->repo.getMovies().getSize(), cmp);
}

来自 Repository.h 的这一行是你的问题:

DynamicVector getMovies() const { return movies; }

您按值而不是按引用返回 DynamicVector,这意味着您正在创建矢量的副本。

因此,当编译器命中

std::sort(
    this->repo.getMovies().getAllElems(),
    this->repo.getMovies().getAllElems() + this->repo.getMovies().getSize(),
    cmp);

它被编译为,"制作电影的副本并将指针传递给该副本的开头。 制作电影的第二个副本,并将指针传递给该副本的末尾。然后从一个副本的开头到另一个副本的结尾排序。这将导致断言。

典型的C++风格会做类似的事情

DynamicVector& getMovies() { return movies; }
const DynamicVector& getMovies() const { return movies; }

即,提供对载体的const和非const访问。

相关内容

最新更新