c语言vector_C++中检查vector是否包含给定元素的几种方式

概述

在编码中经常会遇到一种场景,就是要在数组或列表中查找某个元素是否存在,其实对于这种线性操作,自己实现一个循环来检查是非常简单的事情,那既然这样,为啥还要专门写篇博客来分享呢?
一个最重要的原因就是我们原本就可以用更简洁直观高效的方式去替代手写for循环,这个方式就是使用C++标准库函数。

再啰嗦几句。
通常在面试的时候,为了考察面试者的编码功底,会让其从头实现某些基础的算法,但是在实际开发中,很多东西都有现成的封装。只有把语言、标准库“双剑合璧”才能算是真正的C++。而且据C++标准委员会的安排,今后C++也会更侧重于扩充库而不是扩充语言,可见其分量的轻重了。

总之,C++标准库是一个非常强大的东东,并且实现这些标准库的人都是些非常牛逼的顶级程序员,性能都是最优的。所以不要总想着所有事情都亲力亲为的去写一遍,既浪费时间,写出来的东西可能还很菜。那么,这里就通过一些简单的示例来演示如何通过标准库函数来实现。

正文

如何检查vector中是否包含给定元素。

std::count

最简单的方式是对vector中的指定元素进行计数,如果count不为零,表示该元素存在,那么std::count可以很容易实现。

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

int main()
{
	std::vector<int> v = { 1, 20, 2, 6, 3, 7 };
	int key = 6;

	if (std::count(v.begin(), v.end(), key))
		std::cout << "Element found";
	else
		std::cout << "Element not found";

	return 0;
}

std::find

相比第一种方式,std::find()算法能够更快速的查找给定范围内的值,因为std::count()会变量整个容器以获得元素计数,而find()在找到匹配元素后就立即停止搜索。

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

int main()
{
	std::vector<int> v = { 1, 20, 2, 6, 3, 7 };
	int key = 6;

	if (std::find(v.begin(), v.end(), key) != v.end())
		std::cout << "Element found";
	else
		std::cout << "Element not found";

	return 0;
}

std::find_if

和find相似的还有一个叫 std::find_if()算法,如果查找需要满足某些条件,那么推荐使用该方法。这里我们可以结合lambda来使用,非常简洁。

比如,要查找列表中是否有元素能被5整除

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

int main()
{
    auto lst = {1,4,9,5,11};
    if(std::find_if(lst.begin(),lst.end(),[](auto v){
        if(v%5 ==0)
            return true;
        else
            return  false;
    }) != lst.end()){
        std::cout << "Element found";
    }
    else{
        std::cout << "Element not found";
    }
    return 0;
}

C++ 11 - std::any_of

该算法与std::find_if相似,但不是返回满足条件的的序列中第一个元素的迭代器,而是如果任何元素满足条件后返回true,否则返回false。

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

struct compare
{
	int key;
	compare(int const &i): key(i) { }

	bool operator()(int const &i)
	{
		return (i == key);
	}
};

int main()
{
	std::vector<int> v = { 4, 7, 5, 2, 6, 9 };
	int key = 6;

	if (std::any_of(v.begin(), v.end(), compare(key)))
		std::cout << "Element found";
	else
		std::cout << "Element not found";

	return 0;
}

或者直接修改find_of的案例:

int main()
{
    auto lst = {1,4,9,5,11};
    if(std::any_of(lst.begin(),lst.end(),[](int v){
        if(v%5 ==0)
            return true;
        else
            return  false;
    })){
        std::cout << "Element found";
    }
    else{
        std::cout << "Element not found";
    }
    return 0;
}

C++ 11 - std::none_of

该算法刚好和any_of相反,如果给定的条件在范围内所有元素都返回false,则返回true,如果至少一个元素返回true,则返回false。

直接修改上述示例,将if条件改成“非”就可以了,不再赘述。

std::binary_search

最后一种方法,如果vector是有序的,那么可以考虑使用这种算法,如果在给定范围内找到元素,则返回true,否则返回false。该方式是采用二分法查找,时间复杂度为O(log(n)),速度比较快。

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

int main()
{
	std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7 };
	int key = 4;

	if (std::binary_search(v.begin(), v.end(), key))
		std::cout << "Element found";
	else
		std::cout << "Element not found";

	return 0;
}

OK,以上所有方法都可以实现我们想要的结果,只是在不同情况下选择一种自己喜欢的方式即可。

循环链表及线性表的应用_循环链表及线性表的应用_嵌入式开发工程师-创客学院​www.makeru.com.cn
7bb99036298ee2080f77e7dca537e1ce.png
数据类型_Linux C语言_嵌入式开发工程师-创客学院​www.makeru.com.cn
7bb99036298ee2080f77e7dca537e1ce.png
输入输出1_Linux C语言_嵌入式开发工程师-创客学院​www.makeru.com.cn
7bb99036298ee2080f77e7dca537e1ce.png
if_else_Linux C语言_嵌入式开发工程师-创客学院​www.makeru.com.cn
7bb99036298ee2080f77e7dca537e1ce.png
一维数组1_Linux C语言_嵌入式开发工程师-创客学院​www.makeru.com.cn
7bb99036298ee2080f77e7dca537e1ce.png
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言没有内置的vector数据结构,但是可以用数组模拟vector实现vector主要需要以下几个操作: 1.初始化vector,可以给定一个初始大小,也可以为空。 2.向vector添加元素,如果存储空间不足,需要重新分配内存。 3.删除vector元素,同样需要重新分配内存。 4.访问vector元素,可以通过下标或者迭代器来访问。 5.获取vector的当前大小、容量等状态信息。 以下是一个简单的vector实现: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int* data; int size; int capacity; } vector; void vector_init(vector* vec, int init_capacity) { vec->data = (int*)malloc(init_capacity * sizeof(int)); vec->size = 0; vec->capacity = init_capacity; } void vector_push_back(vector* vec, int val) { if (vec->size == vec->capacity) { vec->capacity *= 2; vec->data = (int*)realloc(vec->data, vec->capacity * sizeof(int)); } vec->data[vec->size++] = val; } void vector_pop_back(vector* vec) { if (vec->size > 0) { vec->size--; if (vec->size < vec->capacity / 2) { vec->capacity /= 2; vec->data = (int*)realloc(vec->data, vec->capacity * sizeof(int)); } } } int vector_get(vector* vec, int index) { if (index < 0 || index >= vec->size) { printf("vector index out of range\n"); return -1; } return vec->data[index]; } int vector_size(vector* vec) { return vec->size; } int vector_capacity(vector* vec) { return vec->capacity; } int main() { vector vec; vector_init(&vec, 10); vector_push_back(&vec, 1); vector_push_back(&vec, 2); vector_push_back(&vec, 3); printf("vector size: %d, capacity: %d\n", vector_size(&vec), vector_capacity(&vec)); printf("vector[0]: %d, vector[1]: %d, vector[2]: %d\n", vector_get(&vec, 0), vector_get(&vec, 1), vector_get(&vec, 2)); vector_pop_back(&vec); printf("vector size: %d, capacity: %d\n", vector_size(&vec), vector_capacity(&vec)); printf("vector[0]: %d, vector[1]: %d\n", vector_get(&vec, 0), vector_get(&vec, 1)); return 0; } ``` 这个vector实现基于动态数组,支持动态扩容和缩容,可以用来存储任意类型的数据。但需要注意的是,由于C语言不支持泛型,所以需要自己实现各种类型的vector,或者使用类似C++的模板来统一实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值