【发布时间】:2011-06-18 19:43:26
【问题描述】:
我声明一个vector<Bla> blaVec 并编写一个函数:
template<typename Iterator>
void doSomething(Iterator first, Iterator last) { ... }
然后我在blaVec 上调用这个函数:
doSomething(blaVec.begin(), blaVec.end());
但是,我真的想要像 doSomething(blaVec) 这样更短的东西,但不必在函数定义中指定 vector。基本上,有没有一个好的标准方法来指定第一个迭代器或者可能是一系列 [begin,end] 迭代器,就像 Boost.Range 所做的那样。
我是一个算法专家,所以我真的不想涉及过于通用的复杂解决方案。我一生中的大部分时间都在编写这样的函数:
void doSomething(vector<int> & bla) { ... }
然而,这些天来,我经常写 doSomething 来操作 list 和 deque 和 vector 所以需要一个更通用的解决方案,这就是我使用迭代器的原因。但这似乎是一个过于冗长的解决方案。你有什么建议?
- doSomething(vector & bla) { ... }
- doSomething(Iterator first, Iterator last) { ... }
- doSomething(/* 一些范围数据结构 */) { ... }
【问题讨论】:
-
你提到了 Boost.Range,所以......为什么不使用它呢?它也有各种漂亮的功能,比如延迟评估等等。
-
我不确定它有多常用。我喜欢使用很多程序员都在使用的技术,因为我的重点是算法而不是软件设计方面。我不喜欢站在软件工程的前沿。有时会导致时间下降。
-
额外的冗长很少,但迭代器范围接口的灵活性要好得多。此外,如果您只需要遍历整个范围,
std::for_each正是为此而设计的。
标签: c++ boost stl iterator range