Я не могу найти, как именно Excel хранит ячейки с SharedStringTable
элементами в памяти во время выполнения, но для их сохранения в качестве индекса элемента SharedStringTable
требуется только одна дополнительная разыменование для доступа к ним, при условии, что элементы хранятся в виде массива. Так что я предполагаю, что это так. Это самый простой способ, и единственный способ сделать это быстрее - иметь представление во время выполненияSharedStringTable
уже отсортированных по элементам. В этом случае сортировка по индексу эквивалентна сортировке по значению. Однако такой подход делает операцию вставки дорогостоящей, так как при вставке новой строки в середину таблицы все индексы больше, чем следует увеличивать, и количество таких ячеек в документе может быть очень большим, вплоть до всех клетки, ссылающиеся на SharedStringTable
.
Если ячейки содержат индексы, такие же, как в файле, вот как можно отсортировать ячейки, представленные columnValue
вектором, на основе строк, на которые они указывают, хранящихся в sharedStrings
векторе (в C ++, поскольку вы сказали, что разницы нет), за счет 2 дополнительные разыменования за операцию сравнения:
// sort indexes from columnValue based on comparing values in sharedStrings
sort(columnValue.begin(), columnValue.end(),
[&sharedStrings](size_t i1, size_t i2){return sharedStrings[i1] < sharedStrings[i2];});
Этого не было в OP, но SharedStringTable
операция обратного поиска медленная и помогает кэширование элементов в словаре.