C++ 如何以向量向量作为其值在地图中迭代?
我正在尝试编写一个函数,它获取一个“向量的向量”,并将它们存储在地图中。本质上,我想在一个以表名为键的映射中存储一系列SQL语句(值) 例如:-table1键将存储所有要输出到table1的sql查询-table2键将存储所有要输出到table2的sql查询 到目前为止,我已经在boost单元测试中编写了这篇文章,在这里我声明了存储查询的C++ 如何以向量向量作为其值在地图中迭代?,c++,dictionary,vector,maps,c++98,C++,Dictionary,Vector,Maps,C++98,我正在尝试编写一个函数,它获取一个“向量的向量”,并将它们存储在地图中。本质上,我想在一个以表名为键的映射中存储一系列SQL语句(值) 例如:-table1键将存储所有要输出到table1的sql查询-table2键将存储所有要输出到table2的sql查询 到目前为止,我已经在boost单元测试中编写了这篇文章,在这里我声明了存储查询的std::vector mapVector。填充后,我想将它们存储在std::map-mapquerys中 现在,我在存储这些数据方面没有问题,只是如何访问我的
std::vector mapVector
。填充后,我想将它们存储在std::map-mapquerys
中
现在,我在存储这些数据方面没有问题,只是如何访问我的mapQueries
map中的元素
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++;
}
BOOST\u AUTO\u TEST\u案例(mapTestVects){
std::string tableName=“ENCODER1”;
std::载体crt1;
std::载体crt2;
std::向量插入列1;
std::向量插入值1;
std::向量插入列2;
std::向量插入值2;
向量映射向量;
std::string crt1Array[256]={“ID”,“RECORDTIME”,“TYPE”,“TIMESTAMP”,“ENCODER1”,“ENCODER2”,“ENCODER3”,“ENCODER4”,“ENCODER5”};
字符串crt2Array[256]={“整数”、“整型”、“整型”、“整型”、“整型”、“整型”、“整型”、“整型”、“整型”、“整型”};
std::string insertColumns1Array[256]={“ID”,“RECORDTIME”,“TYPE”,“TIMESTAMP”,“ENCODER1”,“ENCODER2”,“ENCODER3”,“ENCODER4”,“ENCODER5”};
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”};
对于(int i=0;i<9;i++){
crt1.push_-back(crt1Array[i]);
crt2.push_-back(crt2数组[i]);
insertColumns1.push_back(insertColumns1Array[i]);
insertValues1.向后推_(insertValues1Array[i]);
insertColumns2.push_back(insertColumns2Array[i]);
insertValues2.向后推_(insertValues2Array[i]);
}
mapVector.push_back(插入列1);
mapVector.push_back(插入值1);
mapVector.push_back(插入列2);
mapVector.push_back(插入值2);
地图等等;
地图查询;
insert(std::pair(“table1”,mapVector));
std::map::iterator it=mapQueries.begin();
while(it!=mapQueries.end()){
std::cout first
mapQueries
是std::map
,而不是std::map
,所以使用
而不是
std::map<std::string, std::string>::iterator it = mapQueries.begin();
std::map::iterator it=mapQueries.begin();
您不能以这种方式打印矢量(除非您重载opeator)
mapQueries
是std::map
,而不是std::map
,所以使用
而不是
std::map<std::string, std::string>::iterator it = mapQueries.begin();
std::map::iterator it=mapQueries.begin();
您不能以这种方式打印矢量(除非您重载Operator,否则您不能使用其他类型的迭代器来循环mapQueries
。您可能应该循环mapQueries
,获取键(typestd::string
)和值(typevector
),然后循环遍历向量向量,然后循环其中的每个向量。如下所示:
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
}
}
}
typedef向量vs\u t;
类型定义向量vvs_t;
typedef地图查询;
for(mapQueries_t::迭代器i=mapQueries.begin();i!=mapQueries.end();++i){
string&key=i->first;
对于(vvs_t::迭代器j=i->second.begin();j!=i->second.end();++j){
对于(vs_t::迭代器k=j->begin();k!=j->end();++k){
字符串和值=*k;
//使用键和值
}
}
}
我正在使用引用来防止复制。您不能使用其他类型的迭代器来循环mapQueries
。您可能应该循环mapQueries
,获取键(typestd::string
)和值(typevector
),然后循环遍历向量向量,然后循环其中的每个向量。如下所示:
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
}
}
}
typedef向量vs\u t;
类型定义向量vvs_t;
typedef地图查询;
for(mapQueries_t::迭代器i=mapQueries.begin();i!=mapQueries.end();++i){
string&key=i->first;
对于(vvs_t::迭代器j=i->second.begin();j!=i->second.end();++j){
对于(vs_t::迭代器k=j->begin();k!=j->end();++k){
字符串和值=*k;
//使用键和值
}
}
}
我正在使用引用来防止复制。这是否回答了您的问题?我想您已经更改了代码,现在std::map::iterator it=mapQueries.begin();
是错误的。在任何情况下,使用auto
来获得正确的类型auto it=mapQueries.begin()这回答了你的问题吗?我想你已经更改了你的代码,现在std::map::iterator it=mapQueries.begin();
是错误的。无论如何,使用auto
来获得正确的类型auto it=mapQueries.begin()
严格地说,2是错误的。如果你只是为操作符提供必要的重载,你就可以做任何事情。第一部分你是正确的,我已经修复了,但是我认为自动关键字在C++98中不存在。idclev463035818,胡桃木,jabroni修复了所有问题,谢谢从中学习了很多。谢谢!严格地说ing 2是错误的。如果您只为操作符提供必要的重载,您可以做任何事情。您所说的第一部分是正确的,我已经修复了,但是我认为在C++98中不存在auto关键字。idclev463035818,胡桃木,jabroni修复了所有问题,谢谢从中学习了很多。谢谢!
std::cout << it->first << " :: " << it->second <<std::endl;
// ^^^^^^^^^^ vector
// 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] << " ";
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
}
}
}