2015-12-03 102 views
1

這是做什麼的最好方法。如何獲得一個向量中的第一個非零值的索引<int> in C++

例如,我有

Vector<int> temp = {0,0,1,0,2} 

我想在臨時第一非零值的索引。因此,在這種情況下,我想回答2.

我已經這樣做了,尋找一個更好的辦法..

int index = -1; 
for(int round=0; round < temp.size(); round++) 
    { 
     if(temp[round] > 0) 
     { 
      index = round; 
      break; 
     } 
    } 

感謝, Gunjan

回答

6

你可以使用:

distance(begin(temp), find_if(begin(temp), end(temp), [](auto x) { return x != 0; })); 

如果找不到該項目,將返回數組的大小。您將需要#include <algorithm>和C++ 14編譯模式。在C++ 11中,您必須用int或您的容器包含的任何類型替換auto


Here是可重複使用的λ版本,也許稍微容易閱讀。需要C++ 14。

+3

NB。根據您計劃對結果做什麼,最好保存'find_if'返回的迭代器並使用它,而不是將其轉換爲索引。 –

+0

我目前的做法幾乎與for循環一樣,只要我找到它就返回值。這比我在做什麼更好 – Gunjan

+0

取決於你如何定義「更好」 –

0

最簡單的方法是明顯的方式:

int index = 0; 
for(; index < temp.size(); index++) if(temp[index]) break; 
if(index == temp.size()) { 
    //no such element 
} else { 
    //first non-zero element is temp[index] 
} 

任何試圖使用STDLIB的算法只會臃腫的代碼。

+1

與在各處編寫自己的代碼相比,使用大家都知道(或至少應該知道)「膨脹代碼」的標準算法的方式是什麼? – erlc

+1

@erlc只需比較我對M.M答案的答案的第二行。我的顯然更短...順便說一句:Downvoters,請解釋自己! – cmaster

+0

我自己覺得,它應該比使用算法更好。它做同樣的事情,你沒有加載整個alogirthm類爲此。糾正我,如果我錯了。 – Gunjan

0

您可以使用下面的功能:

int FindSmallerIndex(const std::vector<int> & vec) 
{ 
    int kMin=0; 

    while(vec[kMin]==0) 
    { 
     kMin += 1; 

    } 

return kMin; 
} 
相關問題