Как определить (напечатанную) длину строки std :: string с расширенными символами табуляции?

Учитывая переменную C ++ std :: string , которая включает табуляцию символов, можно ли определить длину этой строки так, как она будет отображаться на «экране»? то есть: [

std::string var = "\t\t\t";
std::cout << var.length();          // result: 3
std::cout << printed_length(var);   // result: 3*(# of spaces per tab)
-121--1872278- Получить самый большой ключ в словаре У меня есть словарь с ключами, которые являются целыми числами. Я хочу получить самый большой ключ. Я не отслеживаю ключи, поэтому они могут быть последовательными (например, 1,2,3,4,5,6), но могут пропустить (1,3,4,5), хотя я сомневаюсь ...

У меня есть словарь с ключами, которые являются целыми числами. Я хочу получить самый большой ключ. Я не отслеживаю ключи, поэтому они могут быть последовательными (например, 1,2,3,4,5,6), но могут пропускать (1,3,4,5), хотя я сомневаюсь, что это имеет какое-то значение.

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

22
задан Vadim Kotov 13 February 2018 в 11:51
поделиться

2 ответа

Если у вас есть доступный LINQ, вы должны сделать:

myDictionary.Keys.Max();
39
ответ дан 29 November 2019 в 04:14
поделиться

Бинарный поиск был бы самым быстрым, но не работал бы против обычного словаря, так как ключи не хранятся в каком-либо определенном порядке. @ Ответ Minitech, используя Linq Max(), самый простой, если вы используете обычный словарь.

Если это операция, которую вам придется выполнять много раз, вы можете рассмотреть возможность перехода к SortedDictionary<TKey, TValue>, который сортирует записи по ключу.

var dict = new SortedDictionary<int, int> {{3, 0}, {12, 0}, {32, 0}, 
                                           {2, 0}, {16, 0}, {20, 0}};
Console.WriteLine(dict.Keys.Last()); //prints 32

РЕДАКТИРОВАТЬ: Этот может быть медленнее , чем обычный словарь. Я полагаю, было бы хорошо упомянуть об этом. Это связано с тем, что записи в словаре хранятся по-разному (красное / черное дерево и хеш-таблицы / хэш-таблица)

Там есть точка, в которой SortedDictionary становится быстрее, чем нормальный Dictionary. Тем не менее, это, вероятно, будет около 1 миллиона предметов, однако это только предположение. Оказывается, это примерно в 10 раз быстрее при таком количестве предметов (но мы все равно говорим о сотых долях секунды, так что это действительно имеет значение?). Это примерно равно выпуску x64 для 100000 наименований. Учитывая дополнительные затраты на добавление элементов в словарь, это, вероятно, того не стоит. Кроме того, я немного «обманул», переопределив компаратор, чтобы он сортировал в обратном порядке, поэтому я фактически делаю dict.Keys.First() вместо последнего, чтобы получить самый большой элемент.

SortedDictionary действительно предназначен, если вам нужно перебирать все пары Key Value по порядку. Я думаю, что ответ @ SimonMourier, вероятно, лучший. Я гарантирую вам, что это самый быстрый, с минимальными накладными расходами.

9
ответ дан 29 November 2019 в 04:14
поделиться
Другие вопросы по тегам:

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