如何在c ++中的vector <int>中获取第一个非零值的索引

时间:2015-12-03 05:39:33

标签: c++ c++11

最好的方法是什么。

例如。我有

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

我想获得temp中第一个非零值的索引。所以在这种情况下我想回答2。

我已经这样做了,寻找更好的方法..

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

谢谢, Gunjan

5 个答案:

答案 0 :(得分:7)

您可以使用:

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

如果找不到该项,则返回数组的大小。您将需要#include <algorithm>和C ++ 14编译模式。在C ++ 11中,您必须将auto替换为int或容器包含的任何类型。

Here是一个具有可重用lambda的版本,可能稍微容易阅读。需要C ++ 14。

答案 1 :(得分:1)

与第一个答案一样,只需使用import AsyncStorage from '@react-native-community/async-storage'; export const getItem = async() => { try { const value = await AsyncStorage.getItem('@storage_token'); if( value !== null ) { return JSON.parse(value); }else { return null; } } catch (error) { console.log(error); return null; } } 而不是std::find_if_not

std::find_if

输出为:

bool IsZero(int i) {
    return i == 0;
}

int main() {
    vector<int> temp = {0, 0, 1, 0, 2};
    auto it = find_if_not(a.begin(), a.end(), IsZero);
    int first_nonzero_idx = distance(temp.begin(), it);

    return first_nonzero_idx;
}

答案 2 :(得分: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算法的尝试都会使代码膨胀。

答案 3 :(得分:0)

您可以使用以下功能:

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

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

    }

 return kMin;
}

答案 4 :(得分:0)

更多通用解决方案!

std::vector<int> a{0, 0, -1, 1, 0};
std::cout << std::distance(a.begin(),
                           std::find_if(a.begin(), a.end(),
                                        [](const auto& x) { return x; }))
          << '\n';