40

如何检查我的数组是否有我正在寻找的元素?

在Java中,我会做这样的事情:

Foo someObject = new Foo(someParameter);
Foo foo;
//search through Foo[] arr
for(int i = 0; i < arr.length; i++){
  if arr[i].equals(someObject)
    foo = arr[i];
}
if (foo == null)
  System.out.println("Not found!");
else
  System.out.println("Found!");

但是在 C++ 中,我认为我不允许搜索 Object 是否为 null 那么 C++ 解决方案是什么?

4

9 回答 9

84

在 C++ 中,您将使用std::find, 并检查结果指针是否指向范围的末尾,如下所示:

Foo array[10];
... // Init the array here
Foo *foo = std::find(std::begin(array), std::end(array), someObject);
// When the element is not found, std::find returns the end of the range
if (foo != std::end(array)) {
    cerr << "Found at position " << std::distance(array, foo) << endl;
} else {
    cerr << "Not found" << endl;
}
于 2013-10-06T23:15:53.750 回答
11

您只需做同样的事情,循环遍历数组以搜索您想要的术语。当然,如果它是一个排序数组,这会更快,所以类似于 prehaps:

for(int i = 0; i < arraySize; i++){
     if(array[i] == itemToFind){
         break;
     }
}
于 2013-10-06T23:17:15.720 回答
10

有很多方法...一种是使用std::find()算法,例如

#include <algorithm>

int myArray[] = { 3, 2, 1, 0, 1, 2, 3 };
size_t myArraySize = sizeof(myArray) / sizeof(int);
int *end = myArray + myArraySize;
// find the value 0:
int *result = std::find(myArray, end, 0);
if (result != end) {
  // found value at "result" pointer location...
}
于 2013-10-06T23:20:12.777 回答
7

contains这是一个适用于数组和容器的简单通用 C++11 函数:

using namespace std;

template<class C, typename T>
bool contains(C&& c, T e) { return find(begin(c), end(c), e) != end(c); };

简单的用法contains(arr, el)有点类似于inPython 中的关键字语义。

这是一个完整的演示:

#include <algorithm>
#include <array>
#include <string>
#include <vector>
#include <iostream>

template<typename C, typename T>
bool contains(C&& c, T e) { 
    return std::find(std::begin(c), std::end(c), e) != std::end(c);
};

template<typename C, typename T>
void check(C&& c, T e) {
    std::cout << e << (contains(c,e) ? "" : " not") <<  " found\n";
}

int main() {
    int a[] = { 10, 15, 20 };
    std::array<int, 3> b { 10, 10, 10 };
    std::vector<int> v { 10, 20, 30 };
    std::string s { "Hello, Stack Overflow" };
    
    check(a, 10);
    check(b, 15);
    check(v, 20);
    check(s, 'Z');

    return 0;
}

输出:

10 found
15 not found
20 found
Z not found
于 2020-10-13T19:10:44.573 回答
3

人们希望简洁地做到这一点。没有什么比花费 10 行代码来实现一些基本的东西更难读的了。在 C++(和其他语言)中,我们拥有所有可以帮助我们在这种情况下实现简洁的东西。我想检查函数参数是否有效,这意味着等于多个值之一。天真和错误,我会先写

if (!any_of({ DNS_TYPE_A, DNS_TYPE_MX }, wtype) return false;

第二次尝试可能是

if (!any_of({ DNS_TYPE_A, DNS_TYPE_MX }, [&wtype](const int elem) { return elem == wtype; })) return false;

不那么不正确,但失去了一些简洁性。但是,这仍然是不正确的,因为在这种情况下(以及许多其他情况),C++ 坚持我同时指定开始和结束迭代器,并且不能将整个容器用作两者的默认值。所以,最后:

const vector validvalues{ DNS_TYPE_A, DNS_TYPE_MX };
if (!any_of(validvalues.cbegin(),  validvalues.cend(), [&wtype](const int elem) { return elem == wtype; })) return false;

哪种方式破坏了简洁性,但我不知道有更好的选择......谢谢你没有指出在 2 个值的情况下我可以只拥有if ( || )。这里最好的方法(如果可能的话)是使用具有默认值的 case 结构,其中不仅检查值,而且执行适当的操作。默认情况可用于表示无效值。

于 2019-12-11T14:33:44.580 回答
2

您可以使用旧的 C 风格编程来完成这项工作。这将需要很少的 C++ 知识。适合初学者。

对于现代 C++ 语言,您通常通过 lambda、函数对象、... 或算法:、、、、或新find语法来完成此操作。 类算法需要更多的代码行。您也可以根据您的特殊需要编写自己的模板函数。find_ifany_offor_eachfor (auto& v : container) { }findfind

这是我的示例代码

#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>

using namespace std;

/**
 * This is old C-like style.  It is mostly gong from 
 * modern C++ programming.  You can still use this
 * since you need to know very little about C++.
 * @param storeSize you have to know the size of store
 *    How many elements are in the array.
 * @return the index of the element in the array,
 *   if not found return -1
 */
int in_array(const int store[], const int storeSize, const int query) {
   for (size_t i=0; i<storeSize; ++i) {
      if (store[i] == query) {
         return i;
      }
   }
   return -1;
}

void testfind() {
   int iarr[] = { 3, 6, 8, 33, 77, 63, 7, 11 };

   // for beginners, it is good to practice a looping method
   int query = 7;
   if (in_array(iarr, 8, query) != -1) {
      cout << query << " is in the array\n";
   }

   // using vector or list, ... any container in C++
   vector<int> vecint{ 3, 6, 8, 33, 77, 63, 7, 11 };
   auto it=find(vecint.begin(), vecint.end(), query);
   cout << "using find()\n";
   if (it != vecint.end()) {
      cout << "found " << query << " in the container\n";
   }
   else {
      cout << "your query: " << query << " is not inside the container\n";
   }

   using namespace std::placeholders;
   // here the query variable is bound to the `equal_to` function 
   // object (defined in std)
   cout << "using any_of\n";
   if (any_of(vecint.begin(), vecint.end(), bind(equal_to<int>(), _1, query))) {
      cout << "found " << query << " in the container\n";
   }
   else {
      cout << "your query: " << query << " is not inside the container\n";
   }

   // using lambda, here I am capturing the query variable
   // into the lambda function
   cout << "using any_of with lambda:\n";
   if (any_of(vecint.begin(), vecint.end(),
            [query](int val)->bool{ return val==query; })) {
      cout << "found " << query << " in the container\n";
   }
   else {
      cout << "your query: " << query << " is not inside the container\n";
   }
}

int main(int argc, char* argv[]) {
   testfind();

   return 0;
}

假设这个文件名为“testalgorithm.cpp”,你需要用它来编译它

g++ -std=c++11 -o testalgorithm testalgorithm.cpp

希望这会有所帮助。如果我犯了任何错误,请更新或添加。

于 2017-05-06T17:58:49.903 回答
2

如果您最初是在寻找这个问题的答案 (int value in sorted (Ascending) int array),那么您可以使用以下代码执行二分搜索(最快的结果):

static inline bool exists(int ints[], int size, int k) // array, array's size, searched value
{
    if (size <= 0)      // check that array size is not null or negative
         return false;
    // sort(ints, ints + size); // uncomment this line if array wasn't previously sorted
    return (std::binary_search(ints, ints + size, k));
}

编辑:如果取消注释排序,也适用于未排序的 int 数组。

于 2018-01-30T23:44:02.590 回答
-1

您可以使用控制语句和循环以初学者的方式进行操作。

#include <iostream>
using namespace std;
int main(){
    int arr[] = {10,20,30,40,50}, toFind= 10, notFound = -1;
    for(int i = 0; i<=sizeof(arr); i++){
        if(arr[i] == toFind){   
            cout<< "Element is found at " <<i <<" index" <<endl;
            return 0;
        }   
    }
    cout<<notFound<<endl;
}
于 2020-09-03T11:12:39.870 回答
-6

C++ 也有 NULL,通常与 0 相同(指向地址 0x00000000 的指针)。

您在 C++ 中使用 NULL 或 0(零)作为指针吗?

所以在 C++ 中,空检查将是:

 if (!foo)
    cout << "not found";
于 2013-10-06T23:16:04.143 回答