【发布时间】:2020-04-06 08:07:18
【问题描述】:
我正在尝试编写一个函数,该函数采用“向量向量”并将它们存储在地图中。本质上,我想将一系列 SQL 语句(值)存储在以表名作为键的映射中。
例如: - table1 key 将存储所有要输出到 table1 的 sql 查询 - table2 key 将存储所有要输出到 table2 的 sql 查询
到目前为止,我已经在一个 boost 单元测试中写了这个,我声明了 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(必需)。
【问题讨论】:
-
这能回答你的问题吗? stackoverflow.com/questions/32785418/…
-
我认为您已经更改了代码,现在
std::map<std::string, std::string>::iterator it = mapQueries.begin();是错误的。在任何情况下使用auto来获得正确的类型auto it = mapQueries.begin();
标签: c++ dictionary vector maps c++98