C ++ менее подробная альтернатива для передачи container.start () и container.end () - PullRequest
1 голос
/ 18 июня 2011

Я объявляю 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, так что это более общее решениебыл вызван, поэтому я пошел с итераторами.Но это только кажется слишком многословным решения.Что вы предлагаете?

  1. doSomething (vector & bla) {...}
  2. doSomething (Итератор первый, Итератор последний) {...}
  3. doSomething (/ * некоторая структура данных диапазона * /) {...}

Ответы [ 2 ]

11 голосов
/ 18 июня 2011

Если вы найдете это многословное, то можете обернуть это следующим:

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
0 голосов
/ 18 июня 2011

Предпочитаю второй, так как он гораздо более гибкий.

Не думаю, что это многословно, но если вы действительно настаиваете, вы можете определить для него макрос, например:

#define FULLITER(a) a.begin(), a.end()

(просто убедитесь, что a - простое выражение, чтобы оно не выполнялось дважды.)

...