Как получить доступ к диапазону / интервалу ключей в упорядоченной карте в C ++? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь написать условие if, в котором я хочу выполнить код в зависимости от того, к каким элементам карты обращаются, например, для карты с 100 элементами только для элементов с 26 по 74. Но я не хочу обращаться к конкретнымключи, а точнее определенная часть карты.Должен ли я сделать это с оператором []?Я пытался

if(map.size()/4 < iterator < map.size()*3/4){}

, но это не работает.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы не можете эффективно получить эту информацию от итератора std::map, поскольку они не являются произвольным доступом (а только двунаправленными).Другими словами, имея std::map итератор, вы можете узнать, сколько записей до и после него, только уменьшая / увеличивая его, пока вы не окажетесь в начале / конце.Если вы делаете это для каждой записи (например, в какой-то функции <algorithm>), это рискует стать узким местом производительности - что может быть приемлемо в вашей ситуации, но вы должны знать об этом.

Если вы можете сделать то, чтоНатан Оливер предполагает, что это здорово, но есть ситуации, когда это может быть не так просто (например, несмежные диапазоны).

0 голосов
/ 10 октября 2018

Просто приведите итераторы к началу и концу диапазона, который вы хотите проверить, например,

auto it = std::next(map.begin(), map.size() / 4);
auto end = std::next(map.begin(), map.size() * 3 / 4);

, и затем вы можете выполнить итерацию этого диапазона, например

for (; it != end; ++it)
{
    // do stuff here
}

.нужен конечный итератор, если вы хотите счетчик.Это экономит затраты на продвижение конечного итератора по карте, что может иметь значение, особенно на больших картах.Это будет выглядеть как

auto it = std::next(map.begin(), map.size() / 4);
auto end = map.size() / 2;
for (size_t counter = 0; counter < end; ++it, ++counter)
{
    // do stuff here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...