2012-09-14 78 views
0

我正在重寫一個自由函數,它需要引用std :: vector。根據給定的標準,它會返回該向量中項目的索引,如果未找到,則返回-1。我寧願它是否返回一個指向該項目的指針或std :: vector <> :: iterator?返回指針或迭代器

當決定返回什麼時應該考慮什麼?

+2

您是否知道['std :: find_if'](http://en.cppreference.com/w/cpp/algorithm/find)? – StackedCrooked

+0

只是爲了讓你知道:大多數std :: vector ::迭代器實現是簡單指針或指針本身的輕量級包裝。但也有例外('std :: vector '),所以使用迭代器。 – PiotrNycz

+0

@StackedCrooked是的,我現在要研究使用此功能。 – Baz

回答

4

返回一個迭代器,如果找不到該元素,則返回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); 
+0

這就是我在做的,謝謝! – Baz

3

只需使用習慣的方法返回interator,如果找不到該項目,請返回.end()

1

你一定要返回一個std::vector<>::iterator,這裏就是爲什麼:

當你把一個數據結構,你應該總是給出正確的「入世對象」。如果使用實際的數組(int[]),則可以發出指針。但對於std :: vector <>,正確的「訪問對象」是迭代器,您不應該通過指針訪問向量中的元素。

您可以返回your_vec.end()以指示找不到元素。

+0

我不確定你爲什麼在這裏發明一個新術語。你的「加入對象」只是迭代器。是的,對於使用指針的數組,指向數組的指針也是一種迭代器形式。 – MSalters

+1

這是因爲我不想混淆問這個問題的人:他要求在「指針」和「std :: vector <> :: iterator」之間做出選擇,並且說它們都是迭代器會導致混淆,所以我開始發明一個新詞。 –