У меня есть следующая простая программа. В test1
и test2
я пытался отсортировать 2 строки "2" и "1", и в приведенном ниже примере функция compare
всегда будет возвращать false.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cassert>
static inline bool compare(const std::string& a, const std::string& b)
{
if (isdigit(b[0]))
return false;
assert(isdigit(a[0]));
return true;
}
static inline void test1()
{
std::cout << "test1:\n";
std::vector<std::string> arr = {
"2", "1"
};
std::stable_sort(arr.begin(), arr.end(), compare);
for (auto e: arr)
std::cout << e << std::endl;
}
static inline void test2()
{
std::cout << "test2:\n";
std::vector<std::string> arr = {
"1", "2"
};
std::stable_sort(arr.begin(), arr.end(), compare);
for (auto e: arr)
std::cout << e << std::endl;
}
static inline bool compare_int(const int& a, const int& b)
{
return a > b;
}
static inline void test3()
{
std::cout << "test3:\n";
std::vector<int> arr = {
9, 3, 13, 7
};
std::stable_sort(arr.begin(), arr.end(), compare_int);
for (auto e: arr)
std::cout << e << ' ';
std::cout << std::endl;
}
int main()
{
test1();
test2();
test3();
return 0;
}
Однако я получаю следующий вывод
test1:
2
1
test2:
1
2
test3:
13 9 7 3
Я в замешательстве, потому что, насколько мне известно, функция compare
в test1 и test2 вернет false, что указывает на то, что эти 2 элемента должны поменяться местами. Но очевидно, что они не меняются и остаются на прежнем месте.
Я неправильно истолковываю возвращаемое значение функции сравнения? Но в test3
он действительно отсортирован по убыванию.
Я не совсем понимаю его внутренности, обрабатывает ли он символы иначе, чем целые числа?
compare("2", "1")
. Вы возвращаетеfalse
. Затем я звонюcompare("1", "2")
. Вы снова возвращаетеfalse
. Видите проблему? Ваша функция сравнения говорит, что 2 идет после 1, и в то же время 1 идет после 2. Это невозможно, но это то, что вы закодировали. - person PaulMcKenzie   schedule 12.11.2018std::cout << a << ' ' << b << std::endl;
, я обнаружу, что она печатает1 2
в обоих случаях, а не2 1
, почему функция сравнения будет вызываться дважды в одном и том же порядке? Для массива с двумя элементами разве не достаточно просто сравнить один раз? - person Zihan   schedule 12.11.2018std::sort
он будет вызываться дважды, а вstd::stable_sort
будет вызываться только один раз с выводом1 2
- person Zihan   schedule 12.11.2018std::partition
илиstd::stable_partition
? Если первый символ — цифра, сгруппируйте ее в какую-нибудь стопку цифр, а все остальные строки группируются в стопку нецифр. Это настоящая цель? - person PaulMcKenzie   schedule 12.11.2018==
, а вместо этого!(a<b) && !(b<a)
, поэтому он будет сравниваться дважды в сортировке (я еще не изучал стабильную сортировку). - person Zihan   schedule 12.11.2018a < b
. Если вы говорите иa < b
, иb < a
, это неоднозначно, а не порядок. Если вы хотите сохранить относительный порядок внутри каждой группы, для этого и предназначенstd::stable_partition
. - person PaulMcKenzie   schedule 12.11.2018partition
или что-то подобное, но я предоставляю вам указать на ваше неправильное представление и решение. - person PaulMcKenzie   schedule 12.11.2018