В настоящее время я создаю программу, которая опирается на несколько векторов и карт для сохранения ранее вычисленной информации. Мои векторы имеют стандартный формат и не очень интересны. Карты имеют вид
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>
быть эффективной заменой использованию строк для идентификации?
Преимущество карты заключается в эффективном запросе данных, связанных с ключом.
Его нельзя сравнивать с кортежами, которые просто собирают значения вместе: вам придется перемещать кортежи самостоятельно, чтобы получить правильное значение.
Использование map<pair<unsigned int, unsigned int>, long double>
как предлагает Майк, - это, вероятно, путь.
Кортежи и Карты используются для самых разных целей. Поэтому это должно быть в первую очередь о том, для чего вы хотите использовать их, а не о том, насколько они эффективны. У вас возникнут проблемы с включением вашего автомобиля с помощью отвертки, так как вы попытаетесь закрепить винт с помощью ключей от вашего автомобиля. Я советовал обоим.
Кортеж - это один маленький набор данных, в вашем случае, например, набор {1,2,3.0234}
. Карта предназначена для отображения нескольких ключей на их значения. Фактически, карта внутренне состоит из нескольких кортежей (пар), каждая из которых содержит ключ и соответствующее значение. Внутри карты пары расположены так, что облегчают поиск ключей.
В вашем случае я предпочел бы map<pair<int, int>, double>
как предлагает ваше редактирование. Ключи (например, пары векторных индексов) намного проще искать и "анализировать", чем эти строки.
map<pair<int,int>,double>
. Вы можете или не можете найтиunordered_map
более эффективным, чемmap
, в зависимости от того, что именно вы делаете с ними.map
могла упорядочивать вещи должным образом. Или, если вам не нужна упорядоченная карта, вы можете использоватьunordered_map
и предоставить соответствующую функцию хеширования.