【发布时间】:2013-11-30 13:23:05
【问题描述】:
我在 C++03 环境中工作,将函数应用到地图的每个键是很多代码:
const std::map<X,Y>::const_iterator end = m_map.end();
for (std::map<X,Y>::const_iterator element = m_map.begin(); element != end; ++element)
{
func( element->first );
}
如果存在key_iterator,相同的代码可以利用std::for_each:
std::for_each( m_map.key_begin(), m_map.key_end(), &func );
那为什么不提供呢?有没有办法让第一种模式适应第二种模式?
【问题讨论】:
-
您可以像
for(iterator it=c.begin(), end=c.end(); ...)一样在循环头中同时初始化it和end,以减少“大量代码”。也就是说,提供您建议的迭代器也会让我想知道它们是否提供了与普通迭代器不同的元素顺序或数量,这反过来又会使代码变得不那么清晰。 -
对于“为什么 C++ 标准库没有 X”的答案几乎总是“他们没有及时添加它”。对于要添加到图书馆的东西,必须有人为它写一个提案,委员会必须讨论它并批准它,而这并没有发生。它不在那里,因为没有人把它放在那里。
-
看看
boost::transform_iterator。对std::pair<key, value_type>的键或值进行切片大约需要 3 行代码。如果您有足够的耐心,我会在可以访问代码时粘贴代码。 -
boost::adaptors::map_keys 的代码行数更少。
标签: c++ iterator standard-library stdmap c++03