繁体   English   中英

如何获取向量中第一个非零值的索引<int>在 C++

[英]How to get index of first non zero value in a vector<int> in c++

做这个的最好方式是什么。

例如。 我有

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;
       }
    }

谢谢,贡詹

您可以使用:

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

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


是一个带有可重用 lambda 的版本,可能更容易阅读。 需要 C++14。

像第一个答案一样,只需使用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

您可以使用以下功能:

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

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

    }

 return kMin;
}

最简单的方法是显而易见的方法:

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 算法的尝试只会使您的代码膨胀。

更通用的解决方案!

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';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM