无法使用std :: sort和自定义比较器对我的数组进行排序

时间:2018-10-13 14:23:32

标签: c++ arrays string sorting vector

if my_index.loc[my_index['TIME']] == date_of_interest

我对例如的排序有些困惑。我们有数字arr.push_back("1"); arr.push_back("34"); arr.push_back("3"); arr.push_back("98"); arr.push_back("9"); arr.push_back("76"); arr.push_back("45"); arr.push_back("4"); sort(arr.begin(), arr.end(), myCompare); //Here is the compare function int myCompare(string X, string Y) { string XY = X.append(Y); string YX = Y.append(X); return XY.compare(YX) > 0 ? 1: 0; } //output should be 998764543431 。当我们首先比较2个字符串时,我们有2个选项{"1","34","3","98","9","76","45","4"}134,因此341越大,我们将得到341作为返回的字符串。

类似地,我们在下一次迭代中得到341,在下一次迭代中得到3341,在下一次迭代中得到983341,但是当9983341到达时,必须在开头或结尾处附加最后将是76998334176这是错误的。我想念什么吗?

1 个答案:

答案 0 :(得分:1)

有几个问题。忽略为什么将int储存为std::string的问题?只有在某个时候将非整数数据存储在数组中时,这才有意义。整数比较非常快。 string比较缓慢,几乎无法产生预期的结果。

首先

std::string::append修改参数。所以,如果我有:

string x = "left";
string y = "right";
string xy = x.append(y);

x现在等于“ {leftright”,xy也是如此。您的比较函数会将x附加到y,然后将y附加到结果。

您的方法,其中X = 1,Y = 34:

string XY = X.append(Y); 
// XY = "134", X = "134", Y = "34"
string YX = Y.append(X); 
// YX = 34134, Y = "34134", X = "134"

return XY.compare(YX) > 0 ? 1: 0; 

因此,这可以表示为

X = X + Y;
XY = X;
Y = Y + X;
YX = Y;

string::compare进行字符比较。因此,如果仅使用string::compare对数组进行排序,则会得到

1       3       34      4       45      76      9       98

第二,

  

当我们第一次比较2个字符串时,我们有2个选项134和341,因此   341更大,我们将获得341作为返回的字符串。

“ 341” 大于“ 134”。但是,您没有将“ 341”与“ 134”进行比较,而是将“ 134”与“ 3134”进行了比较。 “ 3134”更大,因为它以3而不是“ 1”开头。如果数字是“ 1341”和“ 341”,则“ 341”将更大。

如果您的目标只是基于整数对列表进行排序,

int myCompare(string X, string Y)
{
    return atoi(X.c_str()) < atoi(Y.c_str());
}

或更合理地说,使用int数组而不是字符串,并让sort使用它的内置比较功能。