传递container.start()和container.end()的C ++更简洁的替代方法

时间:2011-06-18 19:43:26

标签: c++ boost stl iterator range

我宣布一个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) { ... }

但是,现在,我经常写doSomethinglist以及dequevector进行操作,因此需要稍微更通用的解决方案,这就是为什么我与迭代器一起去了。但它似乎过于冗长的解决方案。你有什么建议?

  1. doSomething(vector&amp; bla){...}
  2. doSomething(Iterator first,Iterator last){...}
  3. doSomething(/ *某些范围数据结构* /){...}

2 个答案:

答案 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是一个简单的表达式,因此它不会被执行两次。)