Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::sort()会更改排序向量?_C++_Sorting_Std - Fatal编程技术网

C++ 为什么std::sort()会更改排序向量?

C++ 为什么std::sort()会更改排序向量?,c++,sorting,std,C++,Sorting,Std,问题是: 在我的第一节课中,我有一个向量,一个双变量,我重载了比较运算符。以下是相关代码: class City { double distance; std::vector<int> coordinates; bool operator<(const City& city) const { return this->distance < city.distance; } // sa

问题是:

在我的第一节课中,我有一个向量,一个双变量,我重载了比较运算符。以下是相关代码:

class City
{
    double distance;
    std::vector<int> coordinates;

    bool operator<(const City& city) const
    {   
        return this->distance < city.distance;
    } 

    // same for the greater-than operator but changing "<" to ">"
};
奇怪的是,只有当我按升序对城市对象进行排序时才会发生这种情况,也就是说,如果我将
CitySortHelper
中的比较器操作符从“一切正常”更改为“一切正常”


你知道为什么会这样吗??感谢您的帮助。

将您的分拣助手更改为

bool operator() ( const City& x , const City& y) const

还要检查City copy构造函数和赋值操作符是否做了正确的事情

CitySortHelper
需要按常量引用而不是按值获取参数。另一件需要记住的事情是sort对城市使用赋值操作符;检查分配运算符是否正常工作。处理好这两个问题应该可以解决问题。

您不应该使用
std::sort()
如果您想保持顺序,应该使用
std::stable\u sort()
<代码>稳定排序保证元素保持其相对顺序,
排序
不保证

而且,排序似乎不是您的问题。似乎有城市对象被推到了向量的某个地方,而你没有注意到它们,因为你在检查一个变量的大小,而不是向量的迭代器。请尝试这样打印,然后告诉我们结果:

for (std::vector <City> ::iterator it = cities->begin(); it != cities->end(); ++it) {
    std::cout << *it << std::endl;
}
for(std::vector::iterator it=cities->begin();it!=cities->end();+it){

std::你的City类有专门的复制构造函数吗?如果你可以只使用
std::sort(cities->begin(),cities->end())
std::sort(cities->begin(),cities->end(),std::greater)
,为什么你需要一个自定义谓词呢?@KerrekSB我也尝试过不使用谓词。在正常情况下,即
std::sort(cities->begin(),cities->end())
在使用less操作符的地方,我仍然可以得到那些新对象。但是使用
std::greater
没有问题。我无法重现您的问题。您需要提供一个完整的、可编译的示例来说明问题。您说可以使用std::greater,但我没有看到任何City::operator>()。在我看过的所有STL impl(即gcc和它)上,std::greater()只需转发到operator>。如果您已经定义了City::operator>,那么发布它可能会有所帮助。我已经更改了
CitySortHelper
,并检查了赋值运算符和复制构造函数。问题仍然存在。它适用于降序,但升序失败。@iska您能更新问题以反映问题吗你做的NGE?给你。现在我坚持按降序排序,然后反转向量:(@iska)你确定
totalCities
等于
cities->size()吗
?我刚刚将您的代码复制到一个CPP文件中,并按升序排序。是的,事实上,这是我在询问之前检查的第一件事。我已更改了
CitySortHelper
,并检查了赋值运算符和复制构造函数。问题仍然存在。它适用于降序,但升序失败。
City(const City &city)
{
    this->distance = city.distance;
    this->coordinates = city.coordinates;
}

City& operator= (const City &city)
{
    this->distance = city.distance;
    this->coordinates = city.coordinates;

    return *this;
}
bool operator() ( const City& x , const City& y) const
for (std::vector <City> ::iterator it = cities->begin(); it != cities->end(); ++it) {
    std::cout << *it << std::endl;
}