Adam Short
Adam Short

Reputation: 35

C++, How to use maps for holding multiple integer values

I'm working on a word Tagging system for a C++ project. I need a system where a map stores the following key-value information:

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

Where ["with"] is the index, and the 3-tuple (16, 6, 15) are values of the index. I've tried maps, but I keep getting semantic errors, which I understand are a result of not being able to give a key more then 1 value.

I tried multi maps, but I can't seem to get the syntax to suit my needs?

I would like to refrain from using Structs or Classes, as this database already contains 200 words, and I'm trying to keep my lines of code readable and too a minimum.

How would I go about this? Am I missing something? How would you declare a system like this?

Upvotes: 0

Views: 1929

Answers (4)

Eric Leschinski
Eric Leschinski

Reputation: 154101

Example for using C++ maps to hold multiple integer values:

#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;
}

Prints:

8
11
53

Just replace the int datatypes with a string and you should be able to map strings to lists of numbers.

Upvotes: 0

Steephen
Steephen

Reputation: 15854

word["with"] = 16, 6, 15;//This usage is wrong

std::multimap or std::unordered_multimap should work for you.

If you define word as follows:

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

You should insert values to map as shown below:

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";    

As user4581301 pointed out in comment if you have C++11 enabled compiler, you can insert values into std::multimap as follows:

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

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

Upvotes: 0

Miki
Miki

Reputation: 41776

You should declare your map as std::map<std::string, std::vector<unsigned int>>, so you can have a vector of values for your index.

Upvotes: 2

bchoi
bchoi

Reputation: 126

You can make a map that maps Strings to Vectors or some other data structure that can hold an arbitrary number of integers.

Worth noting, however, that things like Structs and Classes are components of a language meant to organize code. Structs group related data; classes model groups of related data and their associated behaviors. It's certainly possible to do everything without them but that would make for some very unreadable code.

The number of lines and whether or not you use classes/structs are poor metrics for the complexity and readability of your code. And the modularity they offer far exceeds the minute runtime cost of dereferencing those values.

Upvotes: 0

Related Questions