Как вы можете перебрать карту с вектором векторов в качестве значения? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь написать функцию, которая берет «вектор векторов» и сохраняет их внутри карты. По сути, я хочу сохранить серию SQL операторов (значений) внутри карты с именем таблицы в качестве ключа.

Так, например: - ключ table1 будет хранить все запросы sql для вывода на table1 - ключ table2 будет хранить все sql запросов для вывода в table2

До сих пор я писал это в модульном тесте повышения, где я объявляю std::vector<std::vector<std::string> > mapVector, в котором хранятся мои запросы. После того, как это заполнено, я хочу сохранить их внутри std::map<std::string, std::vector<std::vector<std::string> > > mapQueries.

Теперь у меня нет проблем с хранением этих данных, просто вопрос доступа к элементам внутри моей карты mapQueries.

BOOST_AUTO_TEST_CASE(mapTestVects){
    std::string tableName = "ENCODER1";
    std::vector<std::string> crt1;
    std::vector<std::string> crt2;
    std::vector<std::string> insertColumns1;
    std::vector<std::string> insertValues1;
    std::vector<std::string> insertColumns2;
    std::vector<std::string> insertValues2;
    std::vector<std::vector<std::string> > mapVector;

    std::string crt1Array[256] = {"ID", "RECORDTIME", "TYPE", "TIMESTAMP", "ENCODER1", "ENCODER2", "ENCODER3", "ENCODER4", "ENCODER5"};
    std::string crt2Array[256] = {"INTEGER", "BIGINT", "INTEGER", "BIGINT", "INTEGER", "INTEGER", "INTEGER", "INTEGER", "INTEGER"};
    std::string insertColumns1Array[256] = {"ID", "RECORDTIME", "TYPE", "TIMESTAMP", "ENCODER1", "ENCODER2", "ENCODER3", "ENCODER4", "ENCODER5"};
    std::string insertValues1Array[256] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
    std::string insertColumns2Array[256] = {"ID", "RECORDTIME", "TYPE", "TIMESTAMP", "ENCODER1", "ENCODER2", "ENCODER3", "ENCODER4", "ENCODER5"};
    std::string insertValues2Array[256] = {"10", "11", "12", "13", "14", "15", "16", "17", "18"};

    for(int i = 0; i < 9; i++){
        crt1.push_back(crt1Array[i]);
        crt2.push_back(crt2Array[i]);
        insertColumns1.push_back(insertColumns1Array[i]);
        insertValues1.push_back(insertValues1Array[i]);
        insertColumns2.push_back(insertColumns2Array[i]);
        insertValues2.push_back(insertValues2Array[i]);

    }
    mapVector.push_back(insertColumns1);
    mapVector.push_back(insertValues1);
    mapVector.push_back(insertColumns2);
    mapVector.push_back(insertValues2);

    std::map<std::string, std::vector<std::string> > blah;
    std::map<std::string, std::vector<std::vector<std::string> > > mapQueries;

    mapQueries.insert(std::pair<std::string, std::vector<std::vector<std::string> > >("table1", mapVector) );

    std::map<std::string, std::string>::iterator it = mapQueries.begin();
    while(it != mapQueries.end()){
        std::cout << it->first << " :: " << it->second <<std::endl;
        it++;
    }

Я пытаюсь выполнить итерацию, используя std::map<std::string, std::string>::iterator, однако получаю следующую ошибку компилятора:

error: conversion from ‘std::map<std::__cxx11::basic_string<char>, std::vector<std::vector<std::__cxx11::basic_string<char> > > >::iterator {aka std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, std::vector<std::vector<std::__cxx11::basic_string<char> > > > >}’ to non-scalar type ‘std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::iterator {aka std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >}’ requested
     std::map<std::string, std::string>::iterator it = mapQueries.begin();

error: no match for ‘operator!=’ (operand types are ‘std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::iterator {aka std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >}’ and ‘std::map<std::__cxx11::basic_string<char>, std::vector<std::vector<std::__cxx11::basic_string<char> > > >::iterator {aka std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, std::vector<std::vector<std::__cxx11::basic_string<char> > > > >}’)
     while(it != mapQueries.end()){

Причина, по которой я сохранил свои запросы как векторы, заключается в том, что я использование sqlite3 и необходимо отслеживать тип, значения и данные таблицы, чтобы связывать и выполнять запросы. Я также использую C ++ 98 (обязательно).

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Нельзя использовать итератор для типа, отличного от l oop - mapQueries. Возможно, вам нужно с l oop по mapQueries, получить ключ (тип std::string) и значение (тип vector<vector<string> >), затем l oop через вектор векторов, затем l oop каждый вектор внутри этого , Вот так:

typedef vector<string> vs_t;
typedef vector<vs_t> vvs_t;
typedef map<string, vvs_t> mapQueries_t;
for (mapQueries_t::iterator i = mapQueries.begin(); i != mapQueries.end(); ++i) {
    string& key = i->first;
    for (vvs_t::iterator j = i->second.begin(); j != i->second.end(); ++j) {
        for (vs_t::iterator k = j->begin(); k != j->end(); ++k) {
            string& value = *k;
            // use key and value
        }
    }
}

Я использую ссылки для предотвращения копирования.

1 голос
/ 06 апреля 2020
  1. mapQueries - это std::map<std::string, std::vector<std::vector<std::string> > >, а не std::map<std::string, std::string>, поэтому используйте
std::map<std::string, std::vector<std::vector<std::string> > >::iterator it = mapQueries.begin();

или намного проще (но только после C ++ 11)

auto it = mapQueries.begin();

вместо

std::map<std::string, std::string>::iterator it = mapQueries.begin();
Вы не можете печатать вектор таким образом (если только вы не перегружаете opeator<< Как распечатать содержимое вектора? ):
std::cout << it->first << " :: " << it->second <<std::endl;
//                                  ^^^^^^^^^^ vector

Здесь { ссылка } Есть много способов сделать это. Это примеры, действительные для C ++ 98:

// A.
for (std::vector<std::vector<std::string> >::iterator it1 = it->second.begin(); it1 != it->second.end(); ++it1)
    for (std::vector<std::string>::iterator it2 = it1->begin(); it2 != it1->end(); ++it2)
        std::cout << *it2 << " ";

// B.
for (size_t i = 0; i < it->second.size(); ++i)
    for (size_t j = 0; j < it->second[i].size(); ++j)
        std::cout << it->second[i][j] << " ";
...