【C++】简述STL——string类的使用

获取微信公众号历史文章列表页链接 action=home&__biz=这里替换你的biz==4、链接分享、发送到微信即可访问,注意该链接仅可在微信客户端使用,外部浏览器无法打开。3、拼接通用公式生成链接即为微信公众号历史文章列表链接。,如下图找到红框部分值,复制即为上文biz值。2、浏览器右键查看网页源码,新开页面搜索(1、复制公众号任意文章的链接在浏览器打开。 阅读详情

简述STL

一、STL的简述

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分**,不仅是一个可复用的组件库,而且一个包罗数据结构与算法的软件框架**。

1.STL的框架

image-20221020103721147

2.STL版本

原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意
运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使
用。 HP 版本–所有STL实现版本的始祖

P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,
符号命名比较怪异。

RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。

SGI版本
由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

对于STL的学习我们可以前去官网看文档,多了解了解cplusplus.com


二、编码铺垫

string类本身就是一个模板,为什么要把string写成模板?是因为字符串的数组涉及编码问题,字符数组编码不同。所以需要模板

u16string:表示两个字节

u32string:表示四个字节

这里简单了解一下编码

  • ✨ASCII码

美国信息交换标准码。

ASCII码表是计算机存值和文字符号的对应关系

只有256个字符

  • ✨Unicode

万国码

Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码

包括了utf-8,utf-16,utf-32

utf-8兼容了ASCII,utf-8使用比较普遍,也比较节省空间

  • ✨gbk

gbk即国标,针对中文而设计的编码。采用双字节编码。


三、string类

根据不同的编码选用不同的string(接口是差不多的),这里我们只需重点学习string(utf-8):

image-20221020204928009

string类模板的大概框架:

template <class T>
//动态增长字符数组
class basic_string
{
private:
	T* _str;
	size_t _size;
	size_t _capacity;
};

使用string类的时候,我们要包含头文件#include

下面我们开始说一说string类常用的接口,对于常用接口我们需要熟练使用,其他的即可查阅学习。


四、常见构造

废话不多说,我们直接来使用一下这些构造函数,形成初步了解:

#include <iostream>
#include <string>
using namespace std;

void test_test1()
{
	string s1;//默认构造
	string s2("hello string");//带参构造
	s2 += "world";
	string s3 = "hehe";//构造+拷贝构造----直接构造
	string s4(s2);//拷贝构造
	string s5 = s2;
	string s6(10, 'X');//个数初始化
	string s7("hello world", 5);//取前n个
	string s8(s7, 2, 3);
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	cout << s6 << endl;
	cout << s7 << endl;
	cout << s8 << endl;
}
int main()
{
	test_test1();
	return 0;
}

image-20221104103212636

注意:string类对象可支持直接用cin和cout进行输入和输出,这是因为重载了流插入>>和流提取<<操作符

对于s8,如果取的长度过大,会发生什么?查看文档:

直到结束,并不会报错:

image-20221104103916086

对于默认值npos:

image-20221104104016869

这里的npos是-1,但是这里是无符号,实际并不是-1,是4294967295。

通过这里的构造函数,我们需要知道,对于一些细节东西我们是要学会去看文档的,对于学习文档是非常重要的。


五、operator[]

operator[] 返回pos位置的字符,const string类对象调用

实际上重载了[],让string类可以像数组一样访问。数组的[]的本质是解引用,而这里是调用函数:

image-20221104110145560

char& operator[](size_t pos)
{
	assert(pos<_size);//检查越界
	return _str[i];
}

传引用返回,可读可改。支持修改返回值:我们通过代码来实现这一功能

#include <iostream>
#include <string>
using  namespace std;
int main()
{
	string s("123456");
	//读
	for (size_t i = 0; i < s.size(); i++)
	{
		cout << s[i] << ' ';
	}
	cout << endl;

	//改
	for (size_t i = 0; i < s.size(); i++)
	{
		s[i] += 1;
	}
	cout << s << endl;
	return 0;
}

image-20221104110758346

当然,对于const修饰的字符串肯定不能修改了。


六、访问及遍历

对于遍历操作,第一个方式就是我们上面所说的operator[],第二个方式就是范围for

image-20221021174258380


七、iterator迭代器

对于遍历,除了上面2种方式,我们也可以采取迭代器。迭代器行为上像指针,但是却不一定是指针。对于string的遍历,最简单的肯定是第一种,为什么还要有迭代器的存在呢

  • 为什么要有迭代器❓

迭代器的意义在于通用,所有容器都可以使用迭代器这种方式去进行遍历和修改。而对于string类,[]足矣

1.正向迭代器

迭代器提供了begin和end的函数:

image-20221104114512310

image-20221104114544999

image-20221104114604002

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("123456");
	//读
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//写
	it = s.begin();
	while (it != s.end())
	{
		*it += 1;
		++it;
	}
	cout << s << endl;
	return 0;
}

image-20221104113404530

image-20221104113830663

2.反向迭代器

反向迭代器提供了rbegin和rend:

image-20221104114840313

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello world");
	string::reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
	return 0;
}

image-20221104121643204

3.const迭代器

就是加上const进行修饰。普通的迭代器可读可写,而const迭代器可读不可写,因为const修饰this指向的内容,不支持写

image-20221104124630215

image-20221104124837546

image-20221104124858958

image-20221104124923962

const迭代器也可分为正向迭代器和方向迭代器,提供给const对象使用:

void Print(const string& s)
{
	string::const_iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}

	cout << endl;
	string::const_reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
	cout << endl;
}

int main()
{
	string s("hello world");
	Print(s);
	return 0;
}

image-20221104125342381

c++11还特意区别了普通迭代器和const迭代器提供了下面的接口,作为区分:

image-20221104125608962


八、Capacity容量操作

image-20221104143215255

1.常用接口

函数名称功能说明
size返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty检测字符串释放为空串,是返回true,否则返回false
clear清空有效字符
reserve为字符串预留空间(影响capacity)
resize将有效字符的个数该成n个,多出的空间用字符c填充(影响size和capacity)
//string类对象支持直接用cin和cout进行输入和输出
void Teststring1()
{
	string s("hello world!");
	cout << s.size() << endl;//12
	cout << s.length() << endl;//12
	cout << s.capacity() << endl;//15
	cout << s << endl;
	// 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
	s.clear();
	cout << s.size() << endl;//0
	cout << s.capacity() << endl;//15

	// 将s中有效字符个数增加到10个,多出位置用'a'进行填充
	// “aaaaaaaaaa”
	s.resize(10, 'a');
	cout << s.size() << endl;//10
	cout << s.capacity() << endl;//15
	// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
	// "aaaaaaaaaa\0\0\0\0\0"
	// 注意此时s中有效字符个数已经增加到15个
	s.resize(16,'x');
	cout << s.size() << endl;//16
	cout << s.capacity() << endl;//31,超过15,扩容
	cout << s << endl;
	// 将s中有效字符个数缩小到5个
	s.resize(5);
	cout << s.size() << endl;//5
	cout << s.capacity() << endl;//15
	cout << s << endl;
}

int main()
{
	Test_string1();
	return 0;
}

image-20221027083307928

值得说一下的是,size()和length()两个接口底层是完全一样的,length是由于发展历史缘故导致出现的,无法避免。功能自然也是一样,这里推荐使用size(),方便后期的接口一致。

2.扩容问题

此外,我们也可以来看看是怎么扩容的(在vs2019下):

image-20221027085332833

在g++下:

image-20221027090226398

image-20221027090254044

但是,扩容也会有开销,如果我们提前知道要开多少,就可以使用reserve():

void TestPushBackReserve()
{
	string s;
	s.reserve(1000);
	size_t sz = s.capacity();
	cout << "capacity changed : " << sz << '\n';
	cout << "making s grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}
int main()
{
	TestPushBackReserve();
	return 0;
}

注意:

size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

clear()只是将string中有效字符清空,不改变底层空间大小


九、Modifiers修改操作

对于这些接口可以查看文档:

image-20221104144217248

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
c_str返回C格式字符串
find + npos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回
void Teststring()
{
	string str("hello");
	str.push_back('X'); // 在str后插入X
	str.append("world"); // 在str后追加一个字符"world"
	str += 'C'; // 在str后追加一个字符'C'
	str += "PP"; // 在str后追加一个字符串"PP"
	cout << str << endl;
	cout << str.c_str() << endl; // 以C语言的方式打印字符串
}

int main()
{
	Teststring();
	return 0;
}

image-20221027120853622

void test1()
{
	string s1("hello world");
	//insert
	s1.insert(0, "hwc ");
	cout << s1 << endl;
	s1.insert(9, "hwc");
	cout << s1 << endl;
	//erasse
	s1.erase(9, 3);
	cout << s1 << endl;
	s1.erase(0, 4);
	cout << s1 << endl;
	s1.erase(5,30);
	cout << s1 << endl;
}
void test2()
{
	string s1("hello world hello world");
	string s2("hello world hello world");
	string s3("we are family");
	string s4(s3);
	//assign
	s1.assign("hehehe",5);
	cout << s1 << endl;
	//replace
	s2.replace(6,5,"hwc");
	cout << s2 << endl;

	//find与replace的结合使用
	size_t pos = s3.find(' ');
	while (pos != string::npos)
	{
		s3.replace(pos, 1, "%20");
		pos = s3.find(' ', pos + 3);
	}
	cout << s3 << endl;
	//+=的使用
	string ret;
	for (auto ch : s4)
	{
		if (ch != ' ')
		{
			ret += ch;
		}
		else
		{
			ret += "%20";
		}
	}
	cout << ret << endl;
}
//c_str
void test3()
{
	string file("test.cpp");
	FILE* fout = fopen(file.c_str(), "r");
	assert(fout);
	char ch = fgetc(fout);
	while (ch != EOF)
	{
		cout << ch;
		ch = fgetc(fout);
	}
	fclose(fout);
}

image-20221101145859990

image-20221101145951558

image-20221101150043780

//取文件后缀
//rfind()和substr
void test4()
{
	string file;
	cin >> file;
	size_t pos = file.rfind('.');
	if (pos != string::npos)
	{
		string sub = file.substr(pos);
		cout << sub << endl;
	}
}

image-20221101152654689


十、非成员函数重载

对于流插入和流提取都是以空格、换行作为结束标志的(scanf也是这个样子的)。

image-20221104155040206

为了解决这个问题,我们可以采用getline,

image-20221104155436411

image-20221104155449916

遇到\n才会结束。

这个有什么用呢。比如计算 字符串最后一个单词的长度

#include <iostream>
using namespace std;
#include <string>
int main() {
    string str;
    getline(cin,str);
    size_t pos = str.rfind(' ');
    cout<<str.size()-pos-1<<endl;
}

十一、总结

对于string类的常用接口使用我们就先说到这里,另外,值得在这里强调对于一些接口的使用我们可以去查文档进行理解使用。

IEM模型,地表粗糙度模拟 利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟 立即下载

相关推荐

华硕主板UEFI模式下安装Ubuntu与Windows双系统全攻略

本文详细讲解了在华硕主板UEFI模式下安装Ubuntu与Windows双系统的完整流程。从安装前的BIOS关键设置(如处理安全启动与CSM)、使用GPT分区表,到在Windows中安全分配空间、手动创建Ubuntu分区,最后完成引导配置,提供了避免常见错误的实用技巧,确保双系统稳定共存。

weixin_29199873的博客 340

关于C++中string::npos

发现这个问题是在这段代码中:                                             size_t pos=urls.find_first_of('/',7);                                             if(pos!=string::npos)                                  

luhao1993的专栏 3960

【探秘】二维异形件重叠移除算法:从度量到消除的实战解析

本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。

weixin_28698059的博客 249

std::string::npos 常量解析

std::string::nops

m0_51551385的博客 2181

Arduino-CRSF库详解:嵌入式端CRSF协议解析与ELRS接收机集成

CRSF(Crossfire Serial Protocol)是一种面向FPV无人机的轻量级、高实时性串行通信协议,采用单总线异步传输与8位CRC-8校验机制,广泛应用于遥控链路与遥测交互。其核心在于帧同步(0xC8起始字节)、反相逻辑电平及无重传的广播式设计,对嵌入式平台的UART精度、电平匹配和状态机健壮性提出严苛要求。Arduino-CRSF库正是为资源受限MCU(如ESP32、STM32、ATmega328P)提供零配置、中断安全的协议解析能力,封装了CRC查表计算、超时恢复、多级同步验证等关键机制

weixin_35756690的博客 407

Orin 调试GMSL camera 96712手册重点

96712基础理解

乐于分享 9176

string的find函数返回值和string::npos

先看一种很多人日常使用错误方式 string str(“hello world”); int pos=str.find_first_of(“h”); if(pos!=string::npos) // 或者 if(pos!=-1) {… …// 查找到了 } //不存在是find返回-1 这样的使用,结果是正常的,但并没有很好的理解string find函数的返回类型和string::npos真正的值。 string::find这类型的函数,返回值类型都是string::size_type, 而string

ShenHang_的博客 2286

从一个 ASIN 看透亚马逊:商品模型背后的增长飞轮

在亚马逊电商体系中,每件商品背后都有一套严密的商品建模逻辑。本篇文章以“ASIN 的一生”为线索,系统拆解了亚马逊的商品模型:从飞轮战略出发,剖析 SDP(Single Detail Page)机制如何实现标准化展示;再到 ASIN 编码、父子变体结构与 Offer 分离模型,逐层解析商品信息如何被建构、聚合与呈现。通过图解与案例,文章帮助读者理解商品建品流程、同款聚合原则、价格控制机制等核心逻辑,避免常见运营误区,是一份面向运营、产品、技术人员的实用参考指南。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

C++ 切割字符串

通过stl实现 涉及到string类的函数find find函数 原型:size_t find ( const string&amp; str, size_t pos = 0 ) const; 功能:查找子字符串第一次出现的位置。 参数说明:str为子字符串,pos为初始查找位置。 返回值:找到的话返回第一次出现的位置,否则返回string::npos std::vector&lt;...

骐骥一跃,不能十步;驽马十驾,功在不舍。 734

C++软件异常分析概述

本文将详细讲述Windows系统中软件异常的分类以及常用的排查方法,给大家提供一个借鉴与参考。

dvlinker的技术专栏 4万+

PCL DBSCAN密度聚类【2026最新版】

点云密度聚类的PCL代码实现,与matlab自带的密度聚类算法进行对比验证,结果一致。3万多个点能再2秒左右运行出结果,算法效率尚可。

点云侠的博客 5673

c++ 常见操作

1、 void split(const std::string &delimiters, const std::string &source, std::vector<std::string> &result) { size_t prev_pos = 0, pos = 0; result.resize(0); pos = source.find_first_of(delimiters, po

霜叶的博客 941

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 686

【C++STL详解 —— string类】

string s();//构造一个空字符串//复制s所指向的字符序列//复制s所指向的字符序列的前n个字符//生成n个c字符的字符串//生成str的复制//复制str中字符位置pos开始并且跨越len个字符的部分。

jokr_的博客 2654

最新的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++入门到精通】C++入门 —— string类(STL)

本文以STL(Standard Template Library)和string类为主题,介绍了STL的概念、内容和使用前提。针对string类,详细探讨了它的定义、特点和常见操作,包括构造和初始化、字符串大小和容量、字符访问和修改、字符串连接和拼接、子串操作、字符串比较、字符串修改、获取字符的ASCII码,以及字符串大小写转换等。通过这些内容,读者将了解STL和string类的基本概念并掌握其常用操作,从而更有效地处理和操作字符串。

Yawesh的博客 1414

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【C++初阶】九、STL容器中的string类(上)

C++STL容器中的string类:STL简介 ;string类

正在努力学C呀!(要学好久呢......) 7692

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++STL——String类

C++String类的常用接口

达瓦打不过来学习 1597

【c++丨STL】string类的使用

今天,我们正式进入了STL的大门,学习了第一个容器——string。string虽然接口较多,但是它的实用性很高,为我们处理字符串提供了很多便利。由于其中一些接口并不是很常用,博主就没有过多赘述,大家可以在cplusplus官网进一步了解它们。之后博主会和大家一起,在熟练运用的基础上,深入其底层,并尝试模拟实现string类。

2301_80955819的博客 1803

【C++】STL介绍 + string类使用介绍 + 模拟实现string类

本文带大家入坑STL,学习第一个容器string,并初步了解编码。

x_p96484685433的博客 1096

C++——STL和string类

今天我们来学习一下C++中十分重要的组件库,同时学习一下string类,注意string不属于STL库中。一、STL标准模板库是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。以上就是标准库中的string类的主要功能,和我们具体实现的string类,希望对你有所帮助。

2301_76613753的博客 913

C++中的STL简介与string类

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

小何代码咖啡馆 1291

【八】【C++】STL、string类常见用法

STL(Standard Template Library,标准模板库)是C++标准库的一部分,提供了一系列通用的模板类和函数,这些模板类和函数可以用来实现常见的数据结构和算法。STL使得C++程序员能够更高效地编写代码,同时保持代码的可读性和可重用性。容器是用来管理某一类对象的集合。STL提供了多种类型的容器,每种容器都设计用来管理特定类型的对象集合。STL容器分为序列容器和关联容器两大类:序列容器:维护元素的线性顺序。包括vectorlistdequestring等。

m0_74163972的博客 1362

C++ string类(STL简介 , string类 , 访问修改字符)

STL(标准模板库)是C++标准库的重要组成部分,提供通用数据结构和算法,基于模板技术实现泛型编程。STL包含六大组件,如容器、算法、迭代器等,能提高开发效率、保证性能并促进代码标准化。string类虽不属于STL核心,但常与STL配合使用,提供强大的字符串操作功能,包括初始化、访问、修改、查找、拼接等。学习STL和string类需掌握模板语法、核心容器使用、算法实践及底层原理,建议通过实际项目应用加深理解。

2401_88465894的博客 1190

C++初阶:初识STL、String类接口详细讲解(万字解析)

1.STL介绍1.1概念(标准模板库) 1.2版本问题(主流有4个) 1.3 STL六大组件 2.string类的基本介绍 3.string类对象的构造 4.访问及遍历操作 4.1operator[] ([]加下标) 4.2基于范围for 4.3使用迭代器(最推荐使用) 5.string的迭代器 (lterator) 5.1介绍 5.2 begin () 和end () (正向和常正向) 5.3rbegin () 和rend () (反向和常反向) 6.string类对象的容量操作 6.1sizeleng

qq_74415153的博客 1804

C++STL详解(一)—— string类

文章目录C++STL详解(一) —— sring类一、string的定义方式二、string的插入三、string的拼接四、string的删除五、string的查找六、string的比较七、string的替换八、string的交换九、string的大小和容量十、string中元素的访问十一、string中运算符的使用十二、string中与迭代器相关的函数 C++STL详解(一) —— sring类 本次内容大纲: 一、string的定义方式 string类实现了多个构造函数的重载,常用的构造函数如下: st

2021dragon的博客 9284

【C++STL:string类(一)】最高效的STL学习法:从string类开始,教你如何阅读官方文档

上篇文章我们已经介绍了STL是什么(不仅是是C++标准库的重要组成部分,还是一个包罗数据结构与算法的软件框架,STL版本(原始版本HP版本P.J.版本、RW版本以及SGI版本),STL的六大组件(迭代器、仿函数、算法——简单算法、空间配置器、容器、配接器),STL的重要性(三个维度:笔试、面试、工作)以及学习方法总结(三种境界:能用、明理、能扩展),本文博主就带大家正式进入STL的第一个容器——string类的学习。)函数名称功能说明string()(重点)构造空的string类对象,即空字符串。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 2110
上一篇: 猿创征文 | 【Linux】调试器-gdb使用
下一篇: 【Linux】冯诺依曼体系结构、操作系统及进程概念
平凡的人1
平凡的人1 2022社区之星TOP 2 2022社区之星TOP 2
博客等级 码龄5年 1万+粉丝 156原创
评论 96
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

平凡的人1

佬的鼓励是我创作的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值