我在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;
}
答案 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;