Universal меньше <> для указателей в стандарте C++

Ну, до некоторой степени это зависит от того, куда дела идут на юг. Это - первая вещь, которую я пытаюсь изолировать, и затем я буду использовать echo/print_r () по мере необходимости.

нбар: Вы парни знают, что можно передать верный как второй аргумент print_r () и он возвратит вывод вместо того, чтобы печатать его? Например:

echo "<pre>".print_r($var, true)."</pre>";
31
задан 18 September 2009 в 20:41
поделиться

6 ответов

Два указателя можно сравнить с использованием объектов функции сравнения меньше , больше и т. Д. В противном случае, используя бланкетный оператор < и т.д., это возможно только в том случае, если указатели указывают на элементы одного и того же объекта массива или на один за концом. В противном случае результаты не указаны.

20.3.3 / 8 в C ++ 03

Для шаблонов больше , меньше , больше_equal и less_equal , специализации для любых Тип указателя дает общий порядок, даже если встроенные операторы <, > , <= , > = этого не делают.

Нет необходимости в явной специализации и ручном приведении к size_t : это снизило бы даже переносимость, поскольку отображение reinterpret_cast из указателей в целые числа определяется реализацией и не требуется для уступить любой заказ.


Править : Для более подробного ответа см. этот .

31
ответ дан 27 November 2019 в 22:32
поделиться

Указатели сравнения, которые не выделены в тот же блок не определен, вероятно, из-за того, что существуют модели памяти, с которыми возникают проблемы (и которые раньше были более распространены).

Вам нужно использовать unordered_set <> , который не отображается чтобы потребовать оператор сравнения. Он включен в следующий стандарт C ++, а пока доступен как заголовок Boost .

2
ответ дан 27 November 2019 в 22:32
поделиться

Даже если вы думаете, что сравнение битов указателей безвредно (в конце концов, это просто адреса в памяти, не так ли?), Есть веские причины, по которым языковой стандарт не поощрять это. Во-первых, если у вас есть код, результаты которого зависят от относительного порядка указателей (например, порядок результатов зависит от порядка итерации через набор или карту указателей), результаты будут нестабильными: изменение версии компилятора или операционной системы релиз может изменить результаты. Воспроизводимость достаточно ценна, чтобы избежать этой нестабильности.

3
ответ дан 27 November 2019 в 22:32
поделиться

Нет, недоступно. Стандарт говорит, что указатели сопоставимы со встроенными операторами только тогда, когда они указывают на тот же массив или другой блок памяти. То есть, блок должен быть выделен сразу, в отличие от двух отдельных выделений, которые могут оказаться рядом друг с другом.

Это нормально:

int x[2];
bool b = &x[0] < &x[1];

Это не определено:

int x0;
int x1;
bool b = &x0 < &x1;

Это нормально :

struct foo {
  int x0;
  int x1;
};
foo f;
bool b = &f.x0 < &f.x1;

Оба значения являются членами одной структуры, поэтому они принадлежат одному и тому же блоку памяти (а именно, f ).

На практике, однако, нет ничего плохого в вашем обычае -определенное сравнение.

Однако в вашей специальной специализации нет необходимости, поскольку шаблон std :: less , очевидно, определен для указателей. Так что это нормально:

int x0;
int x1;
std::less<int*> compare;
bool b = compare(&x0, &x1);

Вот ' По-прежнему нет указаний на то, каким должен быть результат, но вы, по крайней мере, обещали получить какой-то результат, в отличие от неопределенного поведения. Вы получаете общий заказ, но не знаете какой заказ, пока не запустите его.

3
ответ дан 27 November 2019 в 22:32
поделиться

Сравнение указателей - довольно сложное занятие. Сравнивать указатели имеет смысл, только если они оба указывают на один и тот же блок памяти, в противном случае операция не определена. Таким образом, (действительный) набор указателей - это довольно специализированная вещь, и нет, в Стандартной библиотеке его нет.

3
ответ дан 27 November 2019 в 22:32
поделиться

Разве hash_set вам не нужен? Он будет частью следующего стандарта

1
ответ дан 27 November 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: