Я переписываю бесплатную функцию, которая принимает ссылку на std :: vector. На основании заданного критерия он возвращает индекс элемента в векторе или -1, если он не найден. Я бы предпочел, чтобы он возвращал указатель на элемент или std :: vector<> :: итератор?
Что я должен учитывать при принятии решения, что возвращать?
Вернуть итератор и 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);
Просто используйте идиоматический способ возврата интегратора, и если элемент не был найден, вернуть .end()
,
Вы должны обязательно вернуть std::vector<>::iterator
и вот почему:
Когда вы обрабатываете структуру данных, вы всегда должны выдавать правильные «объекты доступа». Если вы используете фактический массив (int[]
), вы можете выдавать указатели. Но для std :: vector<>, правильные «объекты доступа» являются итераторами, и вы никогда не должны обращаться к элементам в векторе с помощью указателей.
Вы можете вернуться your_vec.end()
сигнализировать, что элемент не был найден.