2014-10-30 49 views
2

我是C++的新手,所以這可能是一個簡單的問題,但我正在通過Stanley Lippman的C++書籍進行工作,並且有一個練習,您應該在其中編寫一個針對整數向量的非常基本的搜索功能。基本上只需遞增迭代器,直到找到所需內容,然後將迭代器返回給元素。比較迭代器時奇怪的(?)行爲

我的第一個問題是,在書中寫着「不要忘記處理元素無法找到的情況」 - 你會怎麼做?在Java中,我會返回一個null,但我想這不是在C + +(nullptr?)?

第二個問題是,它爲什麼不起作用?我認爲如果我找不到它,我只會返回end() - 迭代器,因爲它是最後一個元素的後面的一個元素(因此,不指向向量中的元素),但我無法獲得比較工作,它說「找到了!」在每一個數字上,當我嘗試它。

#include <vector> 
#include <iterator> 
#include <iostream> 

const std::vector<int>::iterator 
search (std::vector<int> v, const int find) { 
    auto beg = v.begin(); 
    const auto end = v.end(); 

    while (beg != end) { 
     if (*beg == find) { 
      return beg; 
     } 
     ++beg; 
    } 

    return beg; // This can only be reached if beg = v.end()? 
} 

int 
main() { 
    std::vector<int> v; 

    v.insert(v.end(), 2); 
    v.insert(v.end(), 5); 
    v.insert(v.end(), 10); 
    v.insert(v.end(), 7); 
    v.insert(v.end(), 12); 

    for (int i = 0; i < 16; ++i) { 
     std::vector<int>::iterator b = search(v, i); 

     std::cout << i; 

     if (std::distance(b, v.end()) == 0) { 
      std::cout << " not found!"; 
     } else { 
      std::cout << " found!"; 
     } 

     std::cout << std::endl; 
    } 

    return 0; 
} 

與輸出如下:

$ ./a.exe 
0 found! 
1 found! 
2 found! 
3 found! 
4 found! 
5 found! 
6 found! 
7 found! 
8 found! 
9 found! 
10 found! 
11 found! 
12 found! 
13 found! 
14 found! 
15 found! 
+0

爲什麼你使用'std :: distance'?只要檢查'if(b == v.end())' – clcto 2014-10-30 19:56:28

+4

你正在製作一個向量的副本。返回該副本的迭代器效果不佳。 – chris 2014-10-30 19:56:29

回答

4

當你調用該函數,你是按值傳遞的載體,所以它是一個副本。此副本的迭代器將不會與原始向量中的迭代器相同,因此比較失敗。爲了解決這個問題,通過不斷引用傳遞載體:

search(const std::vector<int>& v, const int find) 

要回答你的第一個問題,是的,返回end()迭代器是如何表明未找到值。這就是std::find()的工作方式:

如果找不到這樣的元素,則函數返回最後一個。

+0

我認爲這將是一個簡單的錯誤,謝謝! 我試過std :: distance()方法的原因是我認爲==運算符可能無法與迭代器一起工作(就像在Java中不能完成==一樣) – mnordber 2014-10-30 20:24:51