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
到达时,必须在开头或结尾处附加最后将是76
或998334176
这是错误的。我想念什么吗?
答案 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
使用它的内置比较功能。