C ++ Как хранить два типа данных в векторе

Мне нужно хранить два значения ширины разных типов данных в векторе, например:

vector<HWND, long> hwnd;

А затем получить по индексу и получить доступ к двум значениям:

hwnd[0] // Get HWND and long
hwnd[1] // Get HWND and long

Правильно ли запрашивать векторное решение для этого или, может быть, использовать решение hashmap? Я еще не использовал hashmap, поэтому мне интересно это. Заранее спасибо.

0

Решение

При использовании std::pair это правильное решение, оно теряет некоторую ясность, потому что вы получите доступ к таким элементам:

hwnd[0].first
hwnd[0].second

что делает абсолютно неясным, какая ручка, а какая длинная.

Вместо этого вы должны использовать структуру (я использую count в качестве примера варианта использования, ваш long может иметь совершенно другое значение):

struct HandleCount {
HWND handle;
long count;
};

Итак, ваш код будет выглядеть так:

std::vector<HandleCount> hwnd;

hwnd[0].handle
hwnd[0].count

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

6

Другие решения

Вы можете использовать класс std::pair объявлено в заголовке <utility>

#include <vector>
#include <utility>

//...

std::vector<std::pair<HWND, long>> hwnd;

Для размещения элементов в векторе вы можете использовать методы push_back или же emplace_back
Например

hwnd.emplace_back( new_hwnd, new_long );

или же

hwnd.push_back( { new_hwnd, new_long } );

или же

hwnd.push_back( std::make_pair( new_hwnd, new_long ) );

Для доступа к значениям вы можете написать, например,

hwnd[0].first;
hwnd[0].second;
1

Используйте либо std::pair или же std::tuple или определенный пользователем тип данных.

vector<pair<HWND, long>> a;
a.push_back(make_pair(val1, val2));
cout << a[0].first << endl;
cout << a[0].second << endl;

Стоит отметить, что преимущество пары и кортежа состоит в том, что они определяют общие операторы, такие как operator< а также operator== поэтому вам не нужно переопределять их, если вы хотите сказать, отсортировать этот вектор или применить к нему другие операции, для которых потребуются операторы. Если это не требуется, возможно, просто определите свою собственную структуру.

Карта используется для хранения сопоставления между ключом и значением, поэтому, если это то, что вам действительно нужно, используйте это.

map<int, string> mp;
mp.insert(make_pair(1, "bob"))
mp.insert(make_pair(2, "tim"))
cout << *map.find(2)  << endl;
// prints "tim"
0

С C ++ 11 вы можете сделать это с помощью кортежи:

std::vector< std::tuple<HWND, long> > hwnd;

Добавить новые элементы с любым из:

hwnd.push_back( {handle, count} );
hwnd.push_back( std::make_tuple(handle, count) );

и извлечение элементов выполняется с помощью:

HWND handle0 = std::get<0>(hwnd[0]);
long count0  = std::get<1>(hwnd[0]);
HWND handle1 = std::get<0>(hwnd[1]);
long count1  = std::get<1>(hwnd[1]);

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

0
По вопросам рекламы [email protected]