我正在重寫一個自由函數,它需要引用std :: vector。根據給定的標準,它會返回該向量中項目的索引,如果未找到,則返回-1。我寧願它是否返回一個指向該項目的指針或std :: vector <> :: iterator?返回指針或迭代器
當決定返回什麼時應該考慮什麼?
我正在重寫一個自由函數,它需要引用std :: vector。根據給定的標準,它會返回該向量中項目的索引,如果未找到,則返回-1。我寧願它是否返回一個指向該項目的指針或std :: vector <> :: iterator?返回指針或迭代器
當決定返回什麼時應該考慮什麼?
返回一個迭代器,如果找不到該元素,則返回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);
這就是我在做的,謝謝! – Baz
只需使用習慣的方法返回interator,如果找不到該項目,請返回.end()
。
你一定要返回一個std::vector<>::iterator
,這裏就是爲什麼:
當你把一個數據結構,你應該總是給出正確的「入世對象」。如果使用實際的數組(int[]
),則可以發出指針。但對於std :: vector <>,正確的「訪問對象」是迭代器,您不應該通過指針訪問向量中的元素。
您可以返回your_vec.end()
以指示找不到元素。
我不確定你爲什麼在這裏發明一個新術語。你的「加入對象」只是迭代器。是的,對於使用指針的數組,指向數組的指針也是一種迭代器形式。 – MSalters
這是因爲我不想混淆問這個問題的人:他要求在「指針」和「std :: vector <> :: iterator」之間做出選擇,並且說它們都是迭代器會導致混淆,所以我開始發明一個新詞。 –
您是否知道['std :: find_if'](http://en.cppreference.com/w/cpp/algorithm/find)? – StackedCrooked
只是爲了讓你知道:大多數std :: vector ::迭代器實現是簡單指針或指針本身的輕量級包裝。但也有例外('std :: vector '),所以使用迭代器。 –
PiotrNycz
@StackedCrooked是的,我現在要研究使用此功能。 – Baz