这是我昨天提出的问题的后续行动.我有斯科特迈耶斯关于我写的只写代码的警告.我喜欢原则上使用标准算法来访问std :: map的键或值的想法,但所需的语法是一个小的巴洛克式恕我直言.假设我想将地图的所有键都转储到矢量中.鉴于以下声明,
typedef std::mapMyMap; MyMap m; std::vector v;
哪些代码更易于维护(即可能更少混淆)?
选项1:
std::transform(m.begin(), m.end(), std::back_inserter(v), std::tr1::bind(&MyMap::value_type::first, _1));
选项#2:
for (MyMap::iterator i = m.begin(); i != m.end(); ++i) { v.push_back(i->first); }
选项1是更标准的库,但我必须在精神上分解它以了解正在发生的事情.选项2似乎更容易阅读,代价是可能的小运行时惩罚.我没有因为CPU时间而受伤所以我倾向于选项2.你们同意吗?我应该考虑第三种选择吗?
PS在编写这个问题的过程中,我得出结论,读取std :: map键的最佳方法(对于我的项目)是将它们存储在一个侧容器中并迭代它.可维护性问题仍然存在.
清晰度总是很聪明.做你以后可以阅读的内容.
你并不是唯一一个认为标准代码有点迟钝的人.下一个C++标准将引入lambda函数,因此您可以使用标准算法编写更易读的代码.
第一个与第二个一样可读和可维护 - 如果你知道是什么bind
.我一直在使用Boost :: Bind(基本上相同std::tr1::bind
)足够长,以至于我没有遇到麻烦.
一旦TR1成为官方标准的一部分,您可以放心地假设任何有能力的C++程序员都会理解它.在那之前,它可能会带来一些困难,但我总是想到短期内的长期问题.