Массив - это непрерывный блок памяти. Поэтому, если вы хотите удалить первый элемент, вам нужно переместить все следующие элементы в начало по одному элементу:
void remove(void)
{
memmove(&p[0], &p[1], (MAX_HEAPSIZE - 1) * sizeof(person));
}
Это довольно неэффективно. Появление первого элемента - это обычная операция с кучей, поэтому вы обычно делаете это наоборот - удалите последний элемент массива - это очень быстро, потому что другие элементы массива не затронуты.
void remove(void)
{
heapsize--;
}
heapsize
можно затем использовать как индекс верхнего элемента кучи (если вы, конечно же, сохраните свойство кучи).
Если вы хотите перезаписать первый элемент массива с последним и обнулить память последнего элемента, который больше не используется, вы можете использовать memcpy и memset:
void remove(void)
{
memcpy(&p[0], &p[heapsize - 1], sizeof(person));
memset(&p[heapsize - 1], 0x00, sizeof(person));
}
Обнулить память последнего элемент не является строго необходимым, хотя, потому что вы не должны обращаться к нему в первую очередь. Вместо того, чтобы переписать первый элемент последним с помощью memcpy, его также можно выполнить с помощью strcpy
и назначения приоритета (как в вашем remove
); использование memcpy просто проще.
Самый простой способ сделать это (если вы не беспокоитесь о специальных персонажах Unicode) - это позвонить ToupPercas
:
var areEqual = string1.toUpperCase() === string2.toUpperCase();
ИЗМЕНИТЬ : этот ответ был первоначально добавлен 9 лет назад. Сегодня вы должны использовать localeCompare
с параметром чувствительность: 'акцент'
параметр:
function ciEquals (a, b) {return typeof a === 'string' && typeof b = == 'строка'? a.localeCompare (b, undefined, {чувствительность: 'акцент'}) === 0: a === b; } console.log ("'a' = 'a'?", ciEquals ('a', 'a')); console.log ("'AaA' = 'aAa'?", ciEquals ('AaA', 'aAa')); console.log ("'a' = 'á'?", ciEquals ('a', 'á')); приставка.log ("'a' = 'b'?", ciEquals ('a', 'b'));
{чувствительность: 'accent'}
сообщает localeCompare ()
, чтобы рассматривать два варианта одной и той же базовой буквы как одну и ту же , если только у них разные акценты (как в третьем примере) выше.
В качестве альтернативы вы можете использовать {чувствительность: 'base'}
, которая рассматривает два символа как эквивалентные, если их базовый символ одинаков (поэтому A
будет рассматриваться как эквивалент á
).
Обратите внимание , что третий параметр localeCompare
не поддерживается в IE10 или более ранних версиях, а также в некоторых мобильных браузерах (см. Диаграмму совместимости на странице, указанной выше), поэтому, если вам нужно поддерживать эти браузеры , вам понадобится какой-то запасной вариант:
function ciEqualsInner(a, b) {
return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}
function ciEquals(a, b) {
if (typeof a !== 'string' || typeof b !== 'string') {
return a === b;
}
// v--- feature detection
return ciEqualsInner('A', 'a')
? ciEqualsInner(a, b)
: /* fallback approach here */;
}
Исходный ответ
Лучший способ провести сравнение без учета регистра в JavaScript - использовать метод RegExp match ()
с i
флаг.
Когда обе сравниваемые строки являются переменными (не константами), это немного сложнее, потому что вам нужно сгенерировать RegExp из строки, но передача строки в конструктор RegExp может привести к неправильному совпадения или неудачные совпадения, если в строке есть специальные символы регулярного выражения.
Если вам важна интернационализация, не используйте toLowerCase ()
или toUpperCase ()
, так как это не обеспечивает точного сравнения без учета регистра на всех языках.