1

I am currently trying to access specific value elements of my map and iterate through the map to print all of my map's keys with its specific elements but am running through errors when I am debugging on my IDE (Eclipse) Any ideas on how I can overcome this struggle? Been trying to find answer for the past few days.

when calling for std::find, it says,

'no matching member function for call to 'find'

when using iterator to iterator through map it says,

invalid operands to binary expression ('ostream' (aka 'basic_ostream') and 'const std::__1::vector >')

#include <iostream>
#include <vector>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;

int main() {
    srand(time(NULL));

    cout << "Enter # of rows: ";
    int row;
    cin >> row;
    cout << "Enter # of columns: ";
    int column;
    cin >> column;

    vector<vector<int> > numberBoard;

    int startingIndex = 1;
    for(int i = 0; i < row; i++){
        vector<int> temp;
        for(int j = 0; j < column; j++){
            temp.push_back(startingIndex);
            startingIndex++;
        }
        numberBoard.push_back(temp);
    }

    cout <<"Number Board:" << endl;
    for(int i = 0; i < numberBoard.size(); i++){
        for(int j = 0; j < numberBoard[i].size(); j++){
            cout.width(5);
            cout << numberBoard[i][j];
        }
        cout << endl;
    }

        vector<vector<char> > hiddenBoard(row, vector<char>(column));

        // looping through outer vector vec
        for (int i = 0; i < row; i++) {
          // looping through inner vector vec[i]
          for (int j = 0; j < column; j++) {
              int random = rand()% 32 + 65;
            (hiddenBoard[i])[j] = char(random);
            //i*n + j;
          }
        }

        cout << "\nBoard:" << endl;
        for(int i = 0; i < hiddenBoard.size(); i++){
            for(int j = 0; j < hiddenBoard[i].size(); j++){
                cout.width(5);
                cout << hiddenBoard[i][j];
            }
            cout << endl;
        }
        map<vector<int>, vector<char> > boardMap;
        for(int i = 0; i < 20; i++){
                boardMap[numberBoard[i]] = hiddenBoard[i];
        }

        //using std::find
        int slotNum = 3;
        map<vector<int>, vector<char> >::iterator it = boardMap.find(slotNum);

        //trying to iterate through the map to print its corresponding key and value.
        for(map<vector<int>, vector<char> >::iterator it = boardMap.begin(); it != boardMap.end(); it++){
                cout << it->first << " => " << it->second << endl;
        }

    return 0;
}
  • The map's key type is `vector`, you try to find the key 3 of type `int`. Are you expecting containers and numbers are comparable? The second error messages informed you that `cout` can not print containers. – 273K May 06 '18 at 03:07
  • **No**, I guess not but I was just trying to find a method to put both my 2D vectors into a map so that I can select a certain element in vector and find the associated value with it in vector – flubbernutter May 06 '18 at 03:13
  • Do you know how I woud go about printing the containers in my map? – flubbernutter May 06 '18 at 03:14
  • 1
    I hope you are not banned by Google: https://stackoverflow.com/questions/10750057/how-to-print-out-the-contents-of-a-vector – 273K May 06 '18 at 03:26
  • I still need to print the associated key with its value from the map... – flubbernutter May 06 '18 at 03:32

1 Answers1

0

First of all, I'm curious to know what you're program is supposed to do that requires a map that maps a vector of ints to a vector of chars. The map stores pairs of int vectors and char vectors like:

3 8 5 7 => c j i e
5 7 2 0 => l o x w
1 4 3 8 => k r u a

Perhaps you want an std::map<int, char> which maps an int to a char like:

5 => m
2 => c
0 => a

If you do want to print out the contents of an std::map<std::vector<int>, std::vector<char>>, you need to iterate over the key-value pairs like you're already doing, and then print out the key vector and the value vector separately with loops.

Example:

#include <iostream>
#include <map>
#include <vector>

int main()
{
    std::map<std::vector<int>, std::vector<char>> boardMap; //declare and insert some values for testing
    boardMap.insert(std::make_pair(std::vector<int>({ 8, 6, 2, 7 }), std::vector<char>({ 'o', 'd', 'a' })));
    boardMap.insert(std::make_pair(std::vector<int>({ 4, 1, 0, 4 }), std::vector<char>({ 's', 'd', 'l' })));

    for (auto it = boardMap.begin(); it != boardMap.end(); ++it)
    { //using auto is much better than writing std::map<std::vector<int>, std::vector<char>>::iterator every time
        for (auto vecIt = it->first.begin(); vecIt != it->first.end(); ++vecIt) //output key vector
        {
            std::cout << *vecIt << ' ';
        }
        std::cout << "=>";
        for (auto vecIt = it->second.begin(); vecIt != it->second.end(); ++vecIt) //output value vector
        {
            std::cout << ' ' << *vecIt;
        }
        std::cout << '\n';
    }
    return 0;
}

More elegant version with ranged for loops:

#include <iostream>
#include <map>
#include <vector>

int main()
{
    std::map<std::vector<int>, std::vector<char>> boardMap; //declare and insert some values for testing
    boardMap.insert(std::make_pair(std::vector<int>({ 8, 6, 2, 7 }), std::vector<char>({ 'o', 'd', 'a' })));
    boardMap.insert(std::make_pair(std::vector<int>({ 4, 1, 0, 4 }), std::vector<char>({ 's', 'd', 'l' })));

    for (auto &keyValuePair : boardMap)
    { //using auto is much better than writing std::map<std::vector<int>, std::vector<char>>::iterator every time
        for (auto &keyNum : keyValuePair.first) //output key vector
        {
            std::cout << keyNum << ' ';
        }
        std::cout << "=>";
        for (auto &valueNum : keyValuePair.second) //output value vector
        {
            std::cout << ' ' << valueNum;
        }
        std::cout << '\n';
    }
    return 0;
}

Although the best way would be to use functions from the <algorithm> header such as std::for_each and lambdas to do all the looping for you. I'm not good at that stuff though.

For your find operation, You have a map with std::vector<int> as the key, but you give a single int to the std::map::find function. If you really intend to have a map with vectors as keys, you need to give a vector to the function like:

auto findResult = boardMap.find(std::vector<int>({8, 5, 2, 6}));

This constructs a vector containing four numbers and gives it to std::map::find.

eesiraed
  • 4,626
  • 4
  • 16
  • 34