gpt4 book ai didi

c++ - 迭代 std::map<...> 的简单方法?

转载 作者:太空狗 更新时间:2023-10-29 19:39:46 24 4
gpt4 key购买 nike

我有一个类型类似于的变量:

map<bool, map<string, pair<string, int> > > items;

我将其传递给不同的函数。

有没有一种不那么乏味的方法让我遍历它然后说

for (map<bool, map<string, pair<string, int> > >::iterator p = items.begin();
p != items.end(); p++)
...

每次? (即我可以用宏或模板之类的方式以某种方式省略类型名称吗?手动 typedef 不算数。)

我正在使用 Visual C++ 2008。

最佳答案

您可以使用 BOOST_FOREACH .不过,为了清楚起见,您必须使用 typedef:

typedef std::map<std::string, std::pair<std::string, int> > inner_map;
typedef std::pair<bool, inner_map> map_entry;

BOOST_FOREACH(map_entry& p, items)
{
...
}

不过我更喜欢普通的 typedef 和 for 循环。我看到 typedef 的方式与我看到变量赋值的方式相同:

typedef std::map<std::string, std::pair<std::string, int> > inner_map;
typedef std::map<bool, inner_map>::iterator map_iterator;

for (map_iterator i = items.begin(); i != items.end(); ++i)
{
...
}

那些 typedef 也可以是私有(private)成员。这种编码风格更加清晰,因为您一眼就能看出所涉及的类型。

或者你可以使用普通的 std::for_each,如果你准备好写一个仿函数。我不太喜欢在标准 C++ 中这样做,因为循环体不再是本地的(但这在某些情况下可能是一个优势):

struct some_functor
{
template <typename K, typename V>
void operator()(std::pair<K, V>& item)
{
// In the context below, K is bool and
// V is map<string, pair<string, int> >
}
};

后来

std::for_each(items.begin(), items.end(), some_functor());

如果您升级到 VS2010,您可以选择:auto 和带有 lambda 的 std::for_each(我更喜欢)。使用 C++0x,从技术上讲,您还可以使用基于范围的 for 循环(在 VS2010 中不可用)。

总而言之,我会这样做:

class meaningful_data
{
typedef std::map<std::string, std::pair<std::string, int> > inner_map;
std::map<bool, inner_map> items;

public:
typedef std::pair<bool, inner_map> value_type;
typedef std::map<bool, inner_map>::iterator iterator;
typedef std::map<bool, inner_map>::const_iterator const_iterator;

iterator begin() { return items.begin(); }
const_iterator begin() const { return items.begin(); }
iterator end() { return items.end(); }
const_iterator end() const { return items.end(); }

// Add some interface here (as small as possible)
};

然后像这样迭代:

for (meaningful_data::iterator i = d.begin(); i != d.end(); ++i)
{
...
}

BOOST_FOREACH(meaningful_data::value_type& i, d)
{
...
}

您可能想要封装这样一个复杂的类型,至少使用一些 typedef(如果 inner_map 类型应该是公共(public)的,您不必被迫使用一个完整的类)。

关于c++ - 迭代 std::map<...> 的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7010040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com