Указатель возврата или итератор

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

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


person Baz    schedule 14.09.2012    source источник
comment
Знаете ли вы о std::find_if?   -  person StackedCrooked    schedule 14.09.2012
comment
Просто чтобы вы знали: большинство реализаций std::vector‹T›::iterator являются либо легкой оболочкой для простого указателя, либо просто самим указателем. Однако есть исключения (std::vector<bool>), поэтому используйте итераторы.   -  person PiotrNycz    schedule 14.09.2012
comment
@StackedCrooked Да, теперь я собираюсь изучить возможность использования этой функции.   -  person Baz    schedule 14.09.2012


Ответы (3)


Возвращает итератор и 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);
person Alexandre C.    schedule 14.09.2012

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

person Luchian Grigore    schedule 14.09.2012

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

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

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

person fat-lobyte    schedule 14.09.2012
comment
Я не уверен, почему вы изобретаете здесь новый термин. Ваши объекты доступа - это просто итераторы. Да, для массивов вы используете указатели, но указатели на массив также являются формой итераторов. - person MSalters; 14.09.2012
comment
Это потому, что я не хотел запутать человека, задавшего вопрос: он попросил выбрать между указателями и std::vector‹›::iterator, и сказать, что они оба являются итераторами, в любом случае было бы запутанно, поэтому я пошел с изобретением новое слово. - person fat-lobyte; 14.09.2012