Мэтт, я думаю, что ваша интерпретация верна.Для отдельного удаления элементов это кажется неизбежным.(Но, во всяком случае, для операции \ Omega \ log N стоимость только в 2 раза больше;)
Долгое время я не использовал эти функции, но, просматривая старый код, похоже, что вы можете избежатьчасть накладных расходов, если вы одновременно уничтожаете дерево (если это ваш случай), используя два вызова twalk
:
- , подсчитывающих число
N
элементов в вашем дереве с помощьюсоответствующий вызов twalk
- выделить массив размером
N
указателей на элементы дерева - заполнить этот массив за секунду
twalk
через дерево - runчерез этот массив и для каждого узла дерева сначала удалите его данные, а затем сам узел
Если вам действительно нужна такая вещь, вы можете найти потокобезопасную инкапсуляцию C ++ этих вызовов в нашей библиотеке parXXL в каталоге par/sys
.