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

Ala*_*ing 1 c++ boost iterator stl range

我声明了一个vector<Bla> blaVec并写了一个函数:

template<typename Iterator>
void doSomething(Iterator first, Iterator last) { ... }
Run Code Online (Sandbox Code Playgroud)

然后我用以下方法调用此函数blaVec:

doSomething(blaVec.begin(), blaVec.end());
Run Code Online (Sandbox Code Playgroud)

但是,我真的想要更短的东西,doSomething(blaVec)但无需vector在函数定义中指定.基本上,是否有一种很好的标准方法来指定第一个迭代器或者一些[begin,end]迭代器,就像Boost.Range所做的那样.

我是一个算法人员,所以我真的不想进入过于通用的复杂解决方案.我大部分时间都写过这样的函数:

void doSomething(vector<int> & bla) { ... }
Run Code Online (Sandbox Code Playgroud)

然而,这些天来,我经常写doSomething的是运行在listdequevector这样一个稍微更通用的解决方案是要求,这就是为什么我用迭代器去.但它似乎过于冗长的解决方案.你有什么建议?

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

Naw*_*waz 11

如果你发现那么详细,那么你可以用这个包装:

template<typename Container>
void doSomething(Container &c) 
{
  doSomething(c.begin(), c.end()); //internally call the iterator version.
}
Run Code Online (Sandbox Code Playgroud)

并使用此函数,而不是迭代器版本.

此外,当您不希望该函数对容器中的所有元素进行操作时,您可以使用迭代器版本.例如,

doSomething(c.begin(), c.begin() + 5); //operate on first 5 elements
                                       //assuming c.begin()+5 makes sense
Run Code Online (Sandbox Code Playgroud)