C++ set 和 multiset 容器

【 C++ 】set、multiset的介绍和使用 目录 1、关联式容器 2、键值对 3、树形结构的关联式容器 4、set set的介绍 set的定义 set的使用 5、multiset multiset的介绍 multiset的使用... 阅读详情

set/multiset容器概念

set和multiset是一个集合容器,其中set所包含的元素是唯一的,集合中的元素按一定的顺序排列。set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。在n个数中查找目标数的效率是 log2 n

红黑树定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树.

满足下列性质:

  1. 节点是红色或黑色;
  2. 根节点是黑色;
  3. 所有叶子节点都是黑色节点(NULL);
  4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
    在这里插入图片描述

Set 和 multiset 特点

  1. set中元素插入过程是按排序规则插入,所以不能指定插入位置。
  2. set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
  3. multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。
  4. 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素
  5. 头文件#include <set>

以上笔记都来自于腾讯课堂骑牛学院


按我个人理解,只需要知道:

  1. set容器不能存储重复的元素,即每个元素都是独一无二的;且无论按什么顺序存储,底层代码都会将他们循序存储!
  2. multiset容器可以存储重复的元素。且无论按什么顺序存储,底层代码都会将他们循序存储!

如果想了解它底层是如何排序的,请点击下面链接,会有详细解释:
https://blog.youkuaiyun.com/cpp_learner/article/details/104730577

由于set 和 multiset 的用法都是一样的,所以下面的示例以set为例子说明!

说明:STL里的容器用法都是差不多的,所以一些函数用法和其他容器用法都是一的就不详细解析了,有兴趣了解的可以点下面:

vector容器
deque容器
list容器

特别推荐:
容器和对象的BUG


定义
  1. 不带参数
// 无参
set<int> s1;
set<double> s2;
set<Student> s3; // 类
  1. 带参数
// 有参
set<int> s3(s1.begin(), s1.end());	// 迭代器法
set<int> s4 = s1;					// 赋值运算符重载
set<int> s5(s3);					// 拷贝构造函数

// 交换元素
s1.swap(s2);
例:

set<int> s1, s2;

s1.insert(1);
s2.insert(2);

s1.swap(s2);

// 在容器中插入元素5
s1.insert(5);
// insert的返回值:
因为set容器只能存储唯一的元素,所以,当我们插入重复的元素时会报错,我们可以使用pair记录他的返回值,并把它打印出来。

pair<set<int>::iterator, bool> ret = s1.insert(5);	// 返回值类型:pair<set<int>::iterator, bool>
cout << "第一个迭代器:" << *(ret.first) << endl;
cout << "第二个布尔值:" << ret.second << endl;

返回两个值:第一个是当前元素的迭代器,第二个布尔值bool;
所以可以使用 .first获取迭代器,使用 .second获取布尔值。

//返回容器中第一个数据的迭代器
s1.begin();

// 返回容器中最后一个数据之后的迭代器
s1.end();

// 返回容器中倒数第一个元素的迭代器
s1.rbegin();

// 返回容器中倒数最后一个元素的后面的迭代器
s1.rend();

// 使用迭代器方式输出容器中的元素

set<int>::iterator it = s1.begin();
for (; it != s1.end(); it++) {
	cout << *it << " ";
}
cout << endl;

// 使用迭代器方式逆序输出容器中的元素

// 逆序输出
for (set<int>::reverse_iterator it = s1.rbegin(); it != s1.rend(); it++) {
	cout << *it << " ";
}
cout << endl;

// 返回容器中元素的数目
s1.size();

具体示例可以查看下面测试代码 函数test4
注意事项: 它们没有resize 方法

// 判断容器是否为空
s1.empty();

// 删除迭代器所指的元素,返回下一个元素的迭代器
s1.erase(s1.begin());

// 删除区间[beg,end)的所有元素,返回下一个元素的迭代器
s1.erase(Begin, End); // 下面测试代码中会有代码示例 函数test5

// 删除容器中值为6的元素
s1.erase(6);

// 清除所有元素
s1.clear();

// 返回查找元素的迭代器位置
s1.find(3);
cout << "s1.find --> " << *(s1.find(3)) << endl;

// 返回容器中查找的值的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1
s1.count(4);
cout << "s1.count --> " << s1.count(4) << endl;

// 返回第一个 >= 该元素的迭代器
s1.lower_bound(5);
cout << "s1.lower_bound --> " << *(s1.lower_bound(5)) << endl;

// 返回第一个 > 该元素的迭代器
s1.upper_bound(5);
cout << "s1.upper_bound --> " << *(s1.upper_bound(5)) << endl;

// 返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,
// 如[beg,end)。以上函数返回两个迭代器,而这两个迭代器被封装在pair中。

pair<set<int>::iterator, set<int>::iterator> itii = s1.equal_range(1);
cout << "第一个迭代器:" << *(itii.first) << endl;
cout << "第二个迭代器:" << *(itii.second) << endl;

注意:
// 1, 2, 3, 4, 5, 6
// s1.equal_range(1);
// 返回值的第一个迭代指向自己本身
// 返回值的第二个迭代器指向下一个迭代器,也即是2的迭代器,相当于 ==> […)

// 假如元素的值是:1, 1, 1, 1, 2, 3, 4, 5, 6
// 那么: mulitset.equal_range(1)
// 返回值的第一个迭代指向自己本身
// 返回值的第二个迭代器指向下一个迭代器,也即是2的迭代器,相当于 ==> […)
// 所以是包含了一个区间[1, 1, 1, 1, 2);


测试代码:

#include <set>
#include <iostream>
#include <Windows.h>

using namespace std;

// set&mulitset的定义
void test1(void) {
	// 无参
	set<int> s1;
	set<double> s2;

	for (int i = 0; i < 5; i++) {
		s1.insert(10 - i);
	}

	// 有参
	set<int> s3(s1.begin(), s1.end());
	set<int> s4 = s1;
	set<int> s5(s3);

	s4.insert(999);
	// 交换元素
	s4.swap(s5);

	set<int>::iterator it = s5.begin();
	for (; it != s5.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}


// insert元素插入与pair返回值
void test2(void) {
	set<int> s1;

	//for (int i = 0; i < 5; i++) {
	//	s1.insert(i + 1);
	//}

	//pair<set<int>::iterator, bool> ret = s1.insert(4);	// 返回值类型:pair<set<int>::iterator, bool>
	//cout << "第一个迭代器:" << *(ret.first) << endl;
	//cout << "第二个布尔值:" << ret.second << endl;


	for (int i = 0; i < 5; i++) {
		pair<set<int>::iterator, bool> ret = s1.insert(i);
		if (ret.second) {
			cout << "插入成功!" << endl;

		} else {
			cout << "插入失败!" << endl;
		}
	}


	set<int>::iterator it = s1.begin();
	for (; it != s1.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

// set与迭代器
void test3(void) {
	set<int> s1;

	
	s1.begin();      //返回容器中第一个数据的迭代器。
	s1.end();       //返回容器中最后一个数据之后的迭代器。
	s1.rbegin();   //返回容器中倒数第一个元素的迭代器。
	s1.rend();    //返回容器中倒数最后一个元素的后面的迭代器。

	s1.insert(5);     //在容器中插入元素。
	s1.insert(4);
	s1.insert(3);
	s1.insert(2);
	s1.insert(1);

	set<int>::iterator it = s1.begin();
	for (; it != s1.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	// 逆序输出
	for (set<int>::reverse_iterator it = s1.rbegin(); it != s1.rend(); it++) {
		cout << *it << " ";
	}
	cout << endl;

}

// set/multiset的大小
void test4(void) {
	set<int> s1;

	s1.insert(5);
	s1.insert(4);
	s1.insert(3);
	s1.insert(2);
	s1.insert(1);

	s1.size();	//返回容器中元素的数目
	s1.empty();//判断容器是否为空

	cout << "s1的元素个数:" << s1.size() << endl;
	if (!s1.empty()) {
		cout << "容器不为空!" << endl;

	} else {
		cout << "容器为空!" << endl;
	}

}

// set/multiset的删除
void test5(void) {
	set<int> s1;

	s1.insert(6);
	s1.insert(5);
	s1.insert(4);
	s1.insert(3);
	s1.insert(2);
	s1.insert(1);


	s1.erase(s1.begin());     //删除pos迭代器所指的元素,返回下一个元素的迭代器。

	set<int>::iterator Begin = s1.begin();
	Begin++;
	set<int>::iterator End = s1.end();
	End--;

	s1.erase(Begin, End);	  //删除区间[beg,end)的所有元素,返回下一个元素的迭代器。

	s1.erase(6);     //删除容器中值为6的元素。

	set<int>::iterator it = s1.begin();
	for (; it != s1.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;


	s1.clear();		 // 清除所有元素
}

// set/multiset的查找
void test6(void) {
	set<int> s1;

	s1.insert(6);
	s1.insert(5);
	s1.insert(4);
	s1.insert(3);
	s1.insert(2);
	s1.insert(1);

	// 返回查找元素的迭代器位置
	s1.find(3);
	cout << "s1.find --> " << *(s1.find(3)) << endl;

	// 返回容器中查找的值的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1。
	s1.count(4);
	cout << "s1.count --> " << s1.count(4) << endl;

	// 返回第一个 >= 该元素的迭代器
	s1.lower_bound(5);
	cout << "s1.lower_bound --> " << *(s1.lower_bound(5)) << endl;

	// 返回第一个 > 该元素的迭代器
	s1.upper_bound(5);
	cout << "s1.upper_bound --> " << *(s1.upper_bound(5)) << endl;

	// 返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,
	// 如[beg,end)。以上函数返回两个迭代器,而这两个迭代器被封装在pair中。
	pair<set<int>::iterator, set<int>::iterator> itii = s1.equal_range(1);
	cout << "第一个迭代器:" << *(itii.first) << endl;
	cout << "第二个迭代器:" << *(itii.second) << endl;
	// 1, 2, 3, 4, 5, 6
	// s1.equal_range(1);
	// 返回值的第一个迭代指向自己本身
	// 返回值的第二个迭代器指向下一个迭代器,也即是2的迭代器,相当于 ==> [...)

	// 假如元素的值是:1, 1, 1, 1, 2, 3, 4, 5, 6
	// 那么: mulitset.equal_range(1)
	// 返回值的第一个迭代指向自己本身
	// 返回值的第二个迭代器指向下一个迭代器,也即是2的迭代器,相当于 ==> [...)
	// 所以是包含了一个区间[1, 1, 1, 1, 2);
}

int main(void) {
	//test1();

	//test2();

	//test3();

	//test4();
	
	//test5();

	test6();

	system("pause");
	return 0;
}

总结:
set 和 multiset 容器就已经解析完了,其实用法并不难,STL所有容器用法都差不多,会了一个容器的使用,其他容器也是百通的,所以请认真学习!

C++基础知识 - Set和multiset容器 set/multiset容器概念 set和multiset是一个集合容器,其中set所包含的元素是唯一的,集合中的元素按一定的顺序排列。 set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。在n个数中查找目标数的效率是 log2 n 红黑树定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质: 1)节点是红色或黑色; 2)根节点是黑色; 3)所有叶子节点都是黑色节点(NULL); 4)每个红色节点必须有两个黑色的子节点。(从 阅读详情

相关推荐

c++STL容器的Set和multiset

set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。 set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。 set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。 multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。 不可以直接修改set或multiset容器中的元

希望我的博客,能帮上你解决学习中工作中所遇到的问题 628

C++——set 和 multiset

  文章目录       Set 和 multiset 会根据特定的排序准则,自动将元素排序。两者不同之处在于 multiset 允许元素重复而 set 不允许。 set 和 multiset 包含在头文件中: #include <set> 在这个头文件中,上述两个类型都被定义为命名空间 std 内的 class template: namespace std { template <typename T, typename Compare =

qwjy的博客 5519

VS2019手动添加bits/stdc++.h全指南(附解决‘无法打开源文件‘错误)

本文详细介绍了在Visual Studio 2019中手动配置C++万能头文件bits/stdc++.h的完整方法,解决常见的'无法打开源文件'错误。通过分析GCC与MSVC编译器生态差异,提供了纯手动创建和MinGW移植两种可靠方案,并给出详细的步骤、常见错误排查及最佳实践建议,帮助开发者高效配置竞赛开发环境。

weixin_29011395的博客 545

详解c++STL—容器set/multiset

详解c++STL库—容器set/multiset

怀秋秋意的博客 2335

NVIDIA Jetson Xavier NX刷机教程

NVIDIA Jetson Xavier NX刷机教程,分别安装OS和SDK的经验分享

qq_68271367的博客 6955

【Pico手势开发实战】基于SteamVR串流与MRTK3的跨平台交互方案

本文详细介绍了在Pico设备上,结合SteamVR串流与微软MRTK3框架,实现高效跨平台手势交互开发的完整方案。该方案通过在PC端运行Unity项目并串流至头显,利用MRTK3封装的手势识别与交互组件,大幅提升了开发调试效率与性能上限,并确保了未来向其他OpenXR设备的良好兼容性。

weixin_29001683的博客 216

C++容器set和multiset使用详解

本文介绍了set和multiset的使用,对pair对组也做了简要介绍,同时也使用自定义排序规则对不同数据类型进行了排序操作

weixin_73497355的博客 2109

具身智能与空天具身智能:从理论到实践的AIBOX技术革命

本文深入探讨了具身智能从理论到实践的发展,重点介绍了AIBOX技术如何作为边缘智能计算模块,为无人机、机器人等无人系统提供可进化的“大脑”。文章通过空天具身智能等应用场景,阐述了AIBOX在实现感知、决策、行动一体化闭环中的核心作用,并展望了其在协同智能与规模化部署中的未来挑战与机遇。

lll78的博客 765

set/multiset 容器

set 简介: 所有元素都会在插入时自动被排序 本质: set/multiset属于关联式容器,底层结构是用红黑树实现。 set和multiset区别: set不允许容器中有重复的元素 multiset允许容器中有重复的元素 set构造和赋值 功能描述: 创建set容器以及赋值 构造: set<T> st; //默认构造函数: set(const set &st); //拷贝构造函数 赋值: set& operator=(const

wfea_lff的博客 662

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文详细介绍了如何使用Simulink搭建交流异步电机矢量控制模型,涵盖系统架构设计、关键模块实现、PI调节器参数整定及仿真分析等核心内容。通过实战指南和完整仿真文件,帮助读者掌握矢量控制技术,提升电机控制系统的设计与调试能力。

n4o5p6q7r的博客 250

【ESP32设备通信】-LoRa通信

在本文中,我们将使用 Arduino IDE 将 ESP32 与 LoRa SX1278 (Ra-02) 模块连接起来。 我们将创建一个真实的示例项目,通过 LoRa 无线打开/关闭 LED 进行演示。

视觉与物联智能 1890

C++ set、map、multiset和multimap容器

本文将重点探几种种基于树形结构的关联式容器set、multiset、map和multimap。这这四种容器在C++标准库中占据着重要地位,它们不仅提供了强大的数据存储和检索功能,还各自具备独特的特性,如自动排序、键值对的存储以及多键值的支持。接下来,我们将详细介绍他们的特性和用法,帮助读者更好地理解和运用树形结构关联式容器。集合是按照特定顺序存储唯一元素的容器。在set中,元素的值也标识它(值本身就是键,类型为T),并且每个值必须是唯一的。set中元素的值在容器中。

2301_79171011的博客 1197

虚幻商城 Quixel 免费资产一键入库

在免费领取所有Megascans之后,我们只是有了获取 Quixel Megascans 资产的资格,但是没有入 Fab 库,本文将讲解通过脚本将 Quixel 所有资产入库 Fab。

一碗清深的博客 3268

c++的STL(5)-- set和multiset容器

cout

weixin_68026222的博客 880

AUTOSAE软件配置-达芬奇( DaVinci Configurator)从新建工程开始

方法1,直接使用案例工程,一般SIP包会有一个创建好的案例工程,在这样的路径YOUR_SIP_DIR/Applications/SipAddon/StartApplication下面直接打开这个*.dpa文件即可看到已经预先做好的工程:但是,这个也不是全的,也不一定完全正确,至少MCAL是没有配置好的(MCAL是IC厂商提供的,并不归属SIP包的一部分)。这样就需要你自己去配置你想要的模块,修改里面的错误。

m0_49148264的博客 2935

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c++中的set容器和multiset容器

set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。R...

weixin_43293737的博客 640

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++系列-STL容器之set和multiset

C++系列-STL容器之set和multiset

weixin_48668114的博客 1207

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++ STL 中的 set 和 multiset 容器详解2

在 C++ 标准模板库(STL)中,set和multiset是两种非常重要的关联容器。它们都基于红黑树实现,能够自动对元素进行排序。本文将详细解析这两种容器的特性、用法和区别。自动排序set和multiset都会自动对元素进行排序,默认是升序排列。可以通过自定义比较函数改变排序方式。

2301_80167761的博客 773

c++之Set和multiset容器

c++之Set和multiset容器 文章目录c++之Set和multiset容器前言一、这块在set、multiset容器中出现了红黑树,接下来解释一下二、使用步骤1.引入库2.读入数据总结 前言 1、set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则 插入,所以不能指定插入位置。 2、set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。 3、set不可以直接存取元素。(不可以使用at.(po

Xiao_qsn的博客 403

C++ set和multiset容器的用法

C++ set和multiset容器的用法

私は Mocha!! 1581

深入理解C++中的set和multiset容器

深入理解C++中的set和multiset容器

嵌入式小程同学的博客 1078

C++STL:关联容器之set和multiset

前面介绍了 map 容器和 multimap 容器,类似地,C++ STL 标准库中还提供有 set 和 multiset 这 2 个容器,它们也属于关联容器。more和 map、multimap 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。显然,第一组数据中各键值对的键和值不相等,而第二组中各键值对的键和值对应相等。对于 set 容器来说,只能存储第 2 组键值对,而无法存储第一组键值对。

crossoverpptx的博客 495

基于C++11的Set和Multiset容器分析

基于C++11的set和multiset容器分析

Reol99999的博客 338

C++_STL_Set和multiset容器

set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。 set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。 set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。 multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multi...

weixin_43916755的博客 733

c++标准库——set和multiset容器

c++标准库——set和multiset容器 四月 12th, 2010 by ewangplay 3859 Views Add Comment Trackback 1 set和multiset容器的能力 set和multiset容器的内部结构通常由平衡二叉树(balanced binary tree)来实现。当元素放入容器中时,会按照一定的排序法则自动排序,默

jfkidear的专栏 953

C++提高——Set和multiset容器

1、set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。 set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。 set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。 multiset与set的区别: set支持唯一键值,每个...

Orange_Wu的博客 380
上一篇: C++ 容器存储对象时,指针调用析构函数触发的一系列BUG
下一篇: C++ set&mulitset 与 仿函数(函数对象)
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值