DimensionalLensing
DimensionalLensing

Reputation: 31

How to Map a string and char pair to a string using a std::map?

I am trying to take a std::pair and map it to a std::string using a std::map. The way it works being given a pair consisting of a char and a string, map it to a particular string.

This setup so far works just fine(compiler accepts it):

std::map<std::pair<char, std::string>, std::string> mymap;
std::map<std::pair<char, std::string>, std::string>::iterator it;

But when i try to do this:

mymap['a', "Q1"] = "Q4";
mymap['b', "Q2"] = "Q3";
mymap['c', "Q3"] = "Q2";
mymap['d', "Q4"] = "Q1";

it comes back as this error which I do not understand:

Error   1   error C2679: binary '[' : no operator found which takes a right-hand operand of type 'const char [3]' (or there is no acceptable conversion)

which is the error associated under the left bracket of each of the four lines of code(where a red squiggly appears)

can someone help me to understand what I am doing wrong?

Upvotes: 0

Views: 1830

Answers (2)

Rogus
Rogus

Reputation: 770

the [] operator for the std::map accepts only one argument, whereas you provided two. Since you want to use an object of type std::pair, you should make an std::pair object with your char and std::string. You can do it by enclosing them in {}:

mymap[{'a', "Q1"}] = "Q4";
mymap[{'b', "Q2"}] = "Q3";
mymap[{'c', "Q3"}] = "Q2";
mymap[{'d', "Q4"}] = "Q1";

You could also provide an object definition each time you try yo access the elements:

mymap[std::pair<char, std::string>('a', "Q1")] = "Q4";
mymap[std::pair<char, std::string>('b', "Q2")] = "Q3";
mymap[std::pair<char, std::string>('c', "Q3")] = "Q2";
mymap[std::pair<char, std::string>('d', "Q4")] = "Q1";

But the first option in my opinion is better and less errorprone.

Upvotes: 1

user3001855
user3001855

Reputation: 82

The [] operator on map doesn't take two items. It takes just one. In your case it's expecting a std::pair object. So something like this will work:

mymap[std::pair<char, std::string>('c', "Q1")] = "Q4";

You might want to make a typedef for your pair class:

using myPair = std::pair<char, std::string>;
mymap[myPair('c', "Q1")] = "Q4";

Upvotes: 2

Related Questions