Вернуться указатель или итератор

Я переписываю бесплатную функцию, которая принимает ссылку на std :: vector. На основании заданного критерия он возвращает индекс элемента в векторе или -1, если он не найден. Я бы предпочел, чтобы он возвращал указатель на элемент или std :: vector<> :: итератор?

Что я должен учитывать при принятии решения, что возвращать?

0

Решение

Вернуть итератор и yourVector.end() если элемент не найден.

Это то, что использует стандартная библиотека.

Пример:

auto my_function(std::vector<int>& v) -> decltype(v.begin())
{
// Do the search
...
else return v.end();
}

Лучше, если вы можете сделать

template <typename I>
I my_function(I begin, I end)
{
// Do the search
...
else return end;
}

template <typename C>
auto my_function(C&& c) -> decltype(std::begin(c))
{
return my_function(std::begin(c), std::end(c));
}

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

double my_array[] = { 1, 2, 42, -7 };
auto p = my_function(my_array);
4

Другие решения

Просто используйте идиоматический способ возврата интегратора, и если элемент не был найден, вернуть .end(),

3

Вы должны обязательно вернуть std::vector<>::iteratorи вот почему:

Когда вы обрабатываете структуру данных, вы всегда должны выдавать правильные «объекты доступа». Если вы используете фактический массив (int[]), вы можете выдавать указатели. Но для std :: vector<>, правильные «объекты доступа» являются итераторами, и вы никогда не должны обращаться к элементам в векторе с помощью указателей.

Вы можете вернуться your_vec.end() сигнализировать, что элемент не был найден.

1
По вопросам рекламы [email protected]