【问题标题】:How can you iterate through a map with a vector of vectors as its value?如何以向量的向量作为其值来遍历映射?
【发布时间】: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&lt;std::string, std::string&gt;::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&lt;std::string, std::string&gt;::iterator it = mapQueries.begin(); 是错误的。在任何情况下使用auto 来获得正确的类型auto it = mapQueries.begin();

标签: c++ dictionary vector maps c++98


【解决方案1】:
  1. mapQueriesstd::map&lt;std::string, std::vector&lt;std::vector&lt;std::string&gt; &gt; &gt;,而不是 std::map&lt;std::string, std::string&gt;,所以使用
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();
  1. 你不能用这种方式打印矢量(除非你超载opeator&lt;&lt;How to print out the contents of a vector?):
std::cout << it->first << " :: " << it->second <<std::endl;
//                                  ^^^^^^^^^^ vector

https://stackoverflow.com/a/10758845/3365922 有很多方法可以做到这一点。这些是适用于 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] << " ";

【讨论】:

  • 严格来说2是错误的。如果您只为operator&lt;&lt; 提供必要的重载或打印内容的功能,您可以cout 任何东西
  • 第一部分你是正确的,我已经修复了,但是我不认为 auto 关键字存在于 C++98 中。
  • idclev463035818, walnut, jabroni 解决了所有问题,谢谢
  • 从中学到了很多。谢谢!
【解决方案2】:

您不能使用不同类型的迭代器来循环mapQueries。您可能应该遍历mapQueries,获取键(类型std::string)和值(类型vector&lt;vector&lt;string&gt; &gt;),然后遍历向量向量,然后循环其中的每个向量。像这样:

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
        }
    }
}

我正在使用引用来防止复制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2015-10-07
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多