Эффективность std :: tuple и std :: map

0

В настоящее время я создаю программу, которая опирается на несколько векторов и карт для сохранения ранее вычисленной информации. Мои векторы имеют стандартный формат и не очень интересны. Карты имеют вид

std::map<std::string, long double> 

с целью строки, являющейся анализируемым отображением одного вектора на другой, например

std::map<std::string, long double> rmMap("fvProperty --> fvTime", 3.0234);

где я могу позже разбить строку и сравнить подстроки с именами векторов, чтобы выяснить, какие из них были связаны с получением номера. Тем не менее, я недавно обнаружил, что std :: tuple доступен, что означает, что я могу полностью пропустить строку и вместо этого использовать векторные позиции вместо

std::tuple<unsigned int, unsigned int, long double>

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

Мой вопрос в том, что я не знаю об эффективности здесь. Будет много вызовов для этих кортежей/карт, и эффективность будет существенной, так как программа, как ожидается, будет работать в течение нескольких недель, прежде чем давать конечный результат.

Таким образом, я хотел бы спросить вас, являются ли кортежи более или менее эффективными (с точки зрения памяти, кеша и циклов), чем карты, когда речь идет о больших и интенсивных вычислительных программах.

EDIT: Если кортежи не могут использоваться таким образом, будет ли карта

std::map<std::pair<unsigned int, unsigned int>, long double>

быть эффективной заменой использованию строк для идентификации?

  • 5
    Кортеж не заменяет карту; это просто простая структура с (в данном случае) тремя членами данных. Если вы хотите использовать два значения в качестве ключа карты, вам понадобится что-то вроде map<pair<int,int>,double> . Вы можете или не можете найти unordered_map более эффективным, чем map , в зависимости от того, что именно вы делаете с ними.
  • 1
    Вам, конечно, придется предоставить подходящую функцию сравнения, чтобы map могла упорядочивать вещи должным образом. Или, если вам не нужна упорядоченная карта, вы можете использовать unordered_map и предоставить соответствующую функцию хеширования.
Показать ещё 3 комментария
Теги:
optimization
tuples
maps

2 ответа

4
Лучший ответ

Преимущество карты заключается в эффективном запросе данных, связанных с ключом.

Его нельзя сравнивать с кортежами, которые просто собирают значения вместе: вам придется перемещать кортежи самостоятельно, чтобы получить правильное значение.

Использование map<pair<unsigned int, unsigned int>, long double> как предлагает Майк, - это, вероятно, путь.

  • 0
    Тогда я попробую это. Надеюсь, это окажется быстрее, чем я сейчас делаю. Спасибо.
1

Кортежи и Карты используются для самых разных целей. Поэтому это должно быть в первую очередь о том, для чего вы хотите использовать их, а не о том, насколько они эффективны. У вас возникнут проблемы с включением вашего автомобиля с помощью отвертки, так как вы попытаетесь закрепить винт с помощью ключей от вашего автомобиля. Я советовал обоим.

Кортеж - это один маленький набор данных, в вашем случае, например, набор {1,2,3.0234}. Карта предназначена для отображения нескольких ключей на их значения. Фактически, карта внутренне состоит из нескольких кортежей (пар), каждая из которых содержит ключ и соответствующее значение. Внутри карты пары расположены так, что облегчают поиск ключей.

В вашем случае я предпочел бы map<pair<int, int>, double> как предлагает ваше редактирование. Ключи (например, пары векторных индексов) намного проще искать и "анализировать", чем эти строки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню