我宣布一个vector<Bla> blaVec
并写一个函数:
template<typename Iterator>
void doSomething(Iterator first, Iterator last) { ... }
然后我在blaVec
上使用:
doSomething(blaVec.begin(), blaVec.end());
但是,我真的想要更短的像doSomething(blaVec)
这样的东西,但不必在函数定义中指定vector
。基本上,是否有一种很好的标准方法来指定第一个迭代器或者[{3}}完成的[begin,end]迭代器的范围。
我是算法人员,所以我真的不想进入过于通用的复杂解决方案。我大部分时间都写过这样的函数:
void doSomething(vector<int> & bla) { ... }
但是,现在,我经常写doSomething
对list
以及deque
和vector
进行操作,因此需要稍微更通用的解决方案,这就是为什么我与迭代器一起去了。但它似乎过于冗长的解决方案。你有什么建议?
答案 0 :(得分:11)
如果你发现那么详细,那么你可以用这个包装:
template<typename Container>
void doSomething(Container &c)
{
doSomething(c.begin(), c.end()); //internally call the iterator version.
}
并使用此函数,而不是迭代器版本。
此外,当您不希望该函数对容器中的所有元素进行操作时,您可以使用迭代器版本。例如,
doSomething(c.begin(), c.begin() + 5); //operate on first 5 elements
//assuming c.begin()+5 makes sense
答案 1 :(得分:-1)
首选第二个,因为它更灵活。
我觉得它不够冗长,但如果你真的坚持,你可能想为它定义一个宏,例如:
#define FULLITER(a) a.begin(), a.end()
(只需确保a
是一个简单的表达式,因此它不会被执行两次。)