2015-10-30 6 views
0

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

vector<HWND, long> hwnd; 

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

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

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

+1

use 'std :: vector > hwnd' – 101010

+2

Структура или класс? Вот как вы традиционно сохраняли связанные данные вместе. –

+0

@JoachimPileborg Да, это первое, что я подумал, но должно быть более простое решение. Благодарю. – ProtectedVoid

ответ

6

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

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

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

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

struct HandleCount { 
    HWND handle; 
    long count; 
}; 

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

std::vector<HandleCount> hwnd; 

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

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

0

Используйте либо 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" 
1

Вы можете использовать класс 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; 
0

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

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]); 

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

+2

Хмм, 'std :: tuple <>' не предназначался для замены простых структур данных. Я не уверен, что это будет путь _best practice_ C++ 11. –

+0

Фактически да, и это зависит. Я имел в виду, что это путь C++ 11 по отношению к вам с использованием 'std :: pair'. Я перефразирую с менее сильным заявлением. Благодаря! – Sigismondo