Это может быть связано с выравниванием и заполнением байт, чтобы структура выходила на четное количество байтов (или слов) на вашей платформе. Например, в C на Linux следующие 3 структуры:
#include "stdio.h"
struct oneInt {
int x;
};
struct twoInts {
int x;
int y;
};
struct someBits {
int x:2;
int y:6;
};
int main (int argc, char** argv) {
printf("oneInt=%zu\n",sizeof(struct oneInt));
printf("twoInts=%zu\n",sizeof(struct twoInts));
printf("someBits=%zu\n",sizeof(struct someBits));
return 0;
}
У членов, размер которых (в байтах) равен 4 байтам (32 бита), 8 байтам (2x 32 бита) и 1 байт (2 +6 бит) соответственно. Вышеупомянутая программа (в Linux с использованием gcc) печатает размеры 4, 8 и 4, где последняя структура дополняется так, что это одно слово (4 x 8 бит байтов на моей 32-битной платформе).
oneInt=4
twoInts=8
someBits=4
std::sort
требует сортировщика, который удовлетворяет строгому режиму слабого упорядочения, который здесь объясняется здесь
. Итак, ваш компартер говорит, что a < b
, когда a == b
, который doesn Следуя строжайшему правилу слабого упорядочения, возможно, что алгоритм сработает, потому что он войдет в бесконечный цикл.
Ответ на xorguy довольно хорош.
Я бы просто добавил цитату из стандарта:
25.4 Сортировка и связанные операции [alg.sorting]
Для того, чтобы алгоритмы, отличные от описанных в 25.4.3, работать корректно, comp должен индуцировать строгие слабые порядки .
Термин Строгое относится к требованию неотрицательного отношения (! comp (x, x) для всех x), а член слабый к требованиям, которые не так сильны, как требования для полного упорядочения , но сильнее, чем для частичного упорядочения.
blockquote>Итак, xorguy очень хорошо объясняет это: функция
comp
говорит, чтоa < b
, когдаa == b
, который не следует строгим слабым правило упорядочения ...
std::sort
. Я хотел бы следовать этому, используяstd::sort(std::begin(coll), std::end(coll));
, если ваш компилятор совместим с C ++ 11 (и совместим с OPs i>; VS2012). Если вы когда-либо измените размеры своего массива или вместо этого используете какой-либо из стандартных контейнеров, вы будете рады, что сделали. – WhozCraig 17 August 2013 в 19:04std::sort
использует рекурсивный алгоритм, который вызовет переполнение стека в случае бесконечного цикла. – xorguy 17 August 2013 в 22:17