2015-06-23 2 views
0

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

word["with"] = 16, 6, 15; 

Где [ «с»] является индексом, а 3-кортеж (16, 6, 15) являются значения индекса. Я пробовал карты, но я продолжаю получать семантические ошибки, которые, как я понимаю, являются результатом неспособности дать ключ больше 1 значения.

Я пробовал несколько карт, но я не могу заставить синтаксис соответствовать моим потребностям?

Я хотел бы воздержаться от использования Structs или Classes, так как эта база данных уже содержит 200 слов, и я стараюсь, чтобы мои строки кода были читабельными и слишком минимальными.

Как бы я это сделал? Я что-то упускаю? Как бы вы объявили такую ​​систему?

+0

std :: multi_map или std :: unordered_map должен работать на вас, можете ли вы поделиться своим кодом? – Steephen

+0

map > – user4581301

ответ

0

Вы можете сделать карту, которая отображает Strings в Vectors или какую-либо другую структуру данных, которая может содержать произвольное количество целых чисел.

Стоит отметить, однако, что такие вещи, как Structs and Classes, являются компонентами языка, предназначенного для организации кода. Структурирует данные, связанные с группой; классов групп связанных данных и связанных с ними поведения. Конечно, можно сделать все без них, но это сделает для очень нечитаемого кода.

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

+0

Спасибо, очень информативный. Я должен добавить, что программа уже на 500 строк, я ожидаю, что она будет равна 1500 до конца недели. Мой нынешний сетевой подход, который я разработал для системы, HIVE, полагается на то, чтобы программа была такой маленькой и работала как можно быстрее. Но спасибо за ваш ответ, я обязательно передумаю Структуры. Я не боюсь Классы и Структуры, я уже использую их в программе. –

+0

@AdamShort не путайте маленькие с быстрым. Иногда больше лучше, и если вы разрабатываете систему, а не настройку производительности, начните с простого. Там, где простой и быстрый крест, идите быстро, но когда быстро это запутанный беспорядок, пойдите простым, пока не будет доказано, что вам нужна дополнительная скорость. Легче отлаживать означает меньше ошибок при настройке системы. – user4581301

+0

@ user4581301 Спасибо, что это хороший совет, это мое первое программирование на C++, а также мое первое решение этого проекта, спасибо за полезные советы. Я буду помнить об этом, когда я продвигаюсь! –

1

Вы должны объявить свою карту как std::map<std::string, std::vector<unsigned int>>, чтобы вы могли иметь вектор значений для вашего индекса.

+0

@ o11c Я не думаю, что это было необходимо .... –

+0

@AdamShort Я хотел объяснить * что-то *, так как ни один из «с комментариями» не удаляет причины ... – o11c

+0

@ o11c Ответ короткий (или даже неполный)) не является хорошей причиной для его удаления, если нет уже более 10 ответов. Короче даже не веская причина для downvote, не говоря уже удалить! Брешивость потрясающая. – Yakk

0

word["with"] = 16, 6, 15; // Это использование неправильно

std::multimap или std::unordered_multimap должны работать для вас.

Если вы определяете слово следующим образом:

std::multimap<std::string,int> word; 

Вы должны ввести значения для отображения, как показано ниже:

std::string key="with"; 

word.insert(std::pair<std::string,int>(key,16)); 
word.insert(std::pair<std::string,int>(key,6)); 
word.insert(std::pair<std::string,int>(key,15)); 


for(auto &x : word) 
    std::cout<<x.first<<" " << x.second<<"\n";  

Как user4581301 отметил в комментарии, если у вас есть 11 включен компилятор C++ вы можете вставить значения в std::multimap следующим образом:

word.emplace("with",16); 
    word.emplace("with",6); 
    word.emplace("with",15); 

Demo: http://coliru.stacked-crooked.com/a/c7ede5c497172c5d

+0

Да, но мне нужно 3 значения, а не одно. –

+0

@AdamShort теперь есть 3 значения с ключом как «с» – Steephen

+0

ahhh Я вижу жаль, что я настолько невежественен .... Спасибо! –

0

Пример использования C++ карт для хранения множества целочисленных значений:

#include<iostream> 
#include<map> 
#include<vector> 
using namespace std; 
int main(){ 
    std::map<int, std::vector<int> > mymap2; 
    std::vector<int> myvector; 
    myvector.push_back(8); 
    myvector.push_back(11); 
    myvector.push_back(53); 
    mymap2[5] = myvector; 
    cout << mymap2[5][0] << endl; 
    cout << mymap2[5][1] << endl; 
    cout << mymap2[5][2] << endl; 
} 

Печати:

8 
11 
53 

Просто замените ИНТ типов данные со строкой, и вы должны быть в состоянии отобразить строки к спискам номеров.

Смежные вопросы