如何检查我的数组是否有我正在寻找的元素?
在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是否为空,那么C ++解决方案是什么?
答案 0 :(得分:52)
在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;
}
答案 1 :(得分:7)
有很多方法......一种是使用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...
}
答案 2 :(得分:4)
你会做同样的事情,循环遍历数组来搜索你想要的术语。当然,如果它是一个排序数组,这将更快,所以类似于prehaps:
for(int i = 0; i < arraySize; i++){
if(array[i] == itemToFind){
break;
}
}
答案 3 :(得分:2)
您可以使用旧的C风格编程来完成这项工作。这将需要很少的C ++知识。适合初学者。
对于现代C ++语言,您通常可以通过lambda,函数对象,...或算法实现此目的:find
,find_if
,any_of
,for_each
或新for (auto& v : container) { }
语法。 find
类算法需要更多行代码。您也可以根据自己的特殊需要编写自己的模板find
函数。
这是我的示例代码
#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;
}
假设此文件名为&#39; testalgorithm.cpp&#39; 你需要用
编译它g++ -std=c++11 -o testalgorithm testalgorithm.cpp
希望这会有所帮助。如果我犯了任何错误,请更新或添加。
答案 4 :(得分:1)
如果您最初寻找this question (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));
}
edit:如果取消注释排序,也适用于未排序的int数组。
答案 5 :(得分:1)
这是一个简单的通用C ++ 11函数contains
,可同时用于数组和容器:
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)
有点类似于Python中的in
关键字语义。
这是一个完整的演示:
#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
答案 6 :(得分:0)
使用Newton C ++
bool exists_linear( INPUT_ITERATOR first, INPUT_ITERATOR last, const T& value )
bool exists_binary( INPUT_ITERATOR first, INPUT_ITERATOR last, const T& value )
代码将是这样的:
if ( newton::exists_linear(arr.begin(), arr.end(), value) )
std::cout << "found" << std::endl;
else
std::cout << "not found" << std::endl;
exists_linear和exists_binary都使用std实现。 二进制使用std :: binary_search,并使用std :: find,但直接返回bool,而不是迭代器。
答案 7 :(得分:0)
有人希望这样做很简洁。 没有什么比让代码花更多的可读性了,然后花10行来实现基本的。 在C ++(和其他语言)中,我们有 all 和 any 可以帮助我们在这种情况下实现简洁。我想检查一个函数参数是否有效,即等于多个值之一。 我会天真地和错误地先写
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(||)。最好的方法(如果可能的话)是使用具有默认值的案例结构,该结构不仅检查值,而且执行适当的操作。 默认情况下可用于发送无效值。
答案 8 :(得分:-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;
}
答案 9 :(得分:-4)
C ++也有NULL,通常与0(指向地址0x00000000的指针)相同。
Do you use NULL or 0 (zero) for pointers in C++?
所以在C ++中,null检查将是:
if (!foo)
cout << "not found";