STL_ count,count_if用法

本文详细介绍了STL中的算法分类,通过实例演示了非可变序列算法、可变序列算法、排序算法和数值算法的功能及使用方法,特别强调了count和count_if算法的应用。文章鼓励读者通过总结学习过程,提升理解和实践能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  原本学STL只想看看书,编编代码,但STL内容太多,记不住,而且理解不深刻,所以换种方式,每学过一点东西都总结一下,日积月累,一定会战胜STL这块硬骨头,侯捷把STL的学习分成3个阶段,我连第一阶段还未入门,知道自己几斤几两,努力坚持。。。


STL中算法大致可分为4类

1:非可变序列算法:指不直接修改其所操作的容器内容的算法。

2:可变序列算法:   指可以修改他们操作内容的算法

3:排序算法  :        包括对序列进行排序和合并的算法.搜索算法以及有序序列上的集合操作

4:数值算法:           对容器内容进行数值计算。
count 是一种非可变序列算法,其功能是在序列中查找某个给定值出现的次数。

给一个例子:

#include "iostream"
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
	int a[] = {1,2,3,1,1,1,1,2,2,2,2,3};
	int find_count = count(a,a+12,1);
	cout << "   " <<find_count<<endl;
	find_count = count_if(a,a+12,bind2nd  (not_equal_to<int>(),1));
	cout << "      "<<find_count<<endl;
	return 0;
}


count 的算法就是在一个范围内找到与 value相等值的个数,看过count 的原型(在vs2008中,不知道其他编译器中是否相同),就明白了
template<class _InIt,
	class _Ty> inline
	typename iterator_traits<_InIt>::difference_type
		count(_InIt _First, _InIt _Last, const _Ty& _Val)
	{	// count elements that match _Val
	return _Count(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Val);
	}



这里边用到了count_if   
count_if 算法计算中的元素范围 [first, last) 导致返回 true,谓词的数量,并返回的谓词是真正的元素数。  这个不难理解
原型为:
 
 template<class InputIterator, class Predicate>  inline
       size_t count_if(InputIterator first, InputIterator last,
                              Predicate P)




前两个是迭代器,表示查找半开半闭区间的位置,第三个参数为一个用户定义的predicate function object,而predicate意思就是说是一个返回值是bool型的仿函数(function
 object,也称functor)。


STL 真的不能急,多查资料,多编代码。。。
最主要的是:不要怀疑有没有用,学了就有用,坚持不是谁都能做到的,我要做到









``` import numpy as np from stl import mesh import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def extract_boundary_edges(stl_file): # 加载 STL 文件 stl_mesh = mesh.Mesh.from_file(stl_file) # 获取所有三角形的顶点 triangles = stl_mesh.vectors # 用于存储所有边及其出现次数的字典 edge_count = {} # 遍历所有三角形 for triangle in triangles: for i in range(3): # 获取当前边的两个顶点 edge = tuple(sorted([tuple(triangle[i]), tuple(triangle[(i + 1) % 3])])) # 如果边已经在字典中,增加其出现次数 if edge in edge_count: edge_count[edge] += 1 else: edge_count[edge] = 1 # 筛选出只出现一次的边(边界边) boundary_edges = [edge for edge, count in edge_count.items() if count == 1] return boundary_edges def visualize_boundary_edges(boundary_edges): # 创建一个 3D 图形对象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 遍历所有边界边 for edge in boundary_edges: # 提取边的两个顶点 p1, p2 = np.array(edge) # 绘制边 ax.plot([p1[0], p2[0]], [p1[1], p2[1]], [p1[2], p2[2]], 'b-') # 设置坐标轴标签 ax.set_box_aspect([1, 1, 0.1]) # z轴缩小10倍 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') # 显示图形 plt.show() # 示例用法 stl_file = 'source.stl' boundary_edges = extract_boundary_edges(stl_file) # 打印边界边的数量 print(f"提取到的边界边数量: {len(boundary_edges)}") # 可视化边界边 visualize_boundary_edges(boundary_edges)```拟合这些边,我需要完整代码
最新发布
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值