循环在cpp中设置内部映射

时间:2019-07-03 19:29:01

标签: c++

我在for循环中遇到错误,编译器说's'必须具有指针类型(在s->second.begin()中)。我只想遍历下面的设置。

vector<vector<int>> verticalTraversal(TreeNode* root) {

    map<int, map<int, set<int>>> mep;

    solve(root, 0, 0, mep);
    vector<vector<int>> result;
    for (auto p : mep) {
        vector<int> temp;
        map<int,set<int>> s = p.second;
        for (auto ity = s->second.begin(); ity != s->second.end(); ity++) {    
 //getting error here in s->second.begin()


        }

        //reverse(temp.begin(), temp.end());
        result.push_back(temp);
    }
    return result;
}

2 个答案:

答案 0 :(得分:3)

所以这里有一些代码遍历每组(并打印出所有整数)。

switch(action.type){
    case 'UPDATE_ARRAY': return{
        ...state,
        obj:{
            ...state.obj,
            obj2:{
                ...state.obj.obj2,
                nestedArray : state.obj.obj.nestedArray.concat(action.data)
            }
        }
    }
}

首先要注意的是,有三个循环,而不是两个循环,因为在地图内部的地图中有一个循环,但是有三个级别需要迭代(而不是代码中的两个)。

第二件事是,我删除了所有vector<vector<int>> verticalTraversal() { map<int, map<int, set<int>>> mep; solve(root, 0, 0, mep); vector<vector<int>> result; for (map<int, map<int, set<int>>>::iterator i = mep.begin(); i != mep.end(); ++i) { for (map<int, set<int>>::iterator j = i->second.begin(); j != i->second.end(); ++j) { for (set<int>::iterator k = j->second.begin(); k != j->second.end(); ++k) { cout << *k << '\n'; } } } return result; } 和所有基于范围的循环,并完全明确了所涉及的类型。希望这会使代码更易于理解。

一旦您了解了它,就可以根据需要放回自动装置,甚至可以将循环替换为基于范围的循环。

答案 1 :(得分:0)

最好的办法是编写一个小程序,然后用该小程序进行构想/实验,以了解基本概念。

这里是一个例子:

#include <map>
#include <set>
#include <iostream>

int main()
{
    std::map<int, std::map<int, std::set<int>>> mep;
    mep.insert({0, {{0, {0,1,2,3}}}});   // populate the map
    mep.insert({1, {{1, {1,2,3,4,5}}}}); // populate the map
    // traverse each set in the mep map
    for (auto p : mep) 
    {
        std::map<int, std::set<int>> s = p.second;
        for (auto ity = s.begin(); ity != s.end(); ity++) 
        {    
           std::set<int>& theSet = ity->second;
           for (auto& setV : theSet )
               std::cout << setV << " ";
           std::cout << "\n";
        }
     }
  }

输出:

0 1 2 3 
1 2 3 4 5 

还要注意,您确实应该使用对地图中数据的引用,而不是按值复制它们。这样的事情:

for (auto p : mep)std::map<int, std::set<int>> s = p.second;

产生副本。相反,您应该这样做:

for (auto& p : mep) ... std::map<int, std::set<int>>& s = p.second;