C++-入门到精通【18】string类和字符串流处理的深入剖析

C++标准库头文件完全指南:从原理到实战,解决开发痛点 C++标准库是C++编程的核心基础设施,它通过一系列头文件提供了容器、算法、输入输出等关键功能。理解头文件的工作原理,是掌握C++编程的基础。从编译器的预处理机制到链接器的符号解析,头文件扮演着连接源代码与库实现的桥梁角色。其技术价值在于提升代码复用性、保证类型安全,并支持泛型编程范式。在实际应用场景中,无论是桌面应用、嵌入式系统还是高性能计算,正确使用头文件都能显著提升开发效率和代码质量。本文聚焦于C++标准库头文件的体系结构,深入解析 `<algorithm>` 和 `<vector>` 等核心组件的使 阅读详情

C+±入门到精通【18】string类和字符串流处理的深入剖析



一、简介

我们通过头文件<string>来定义的string类型的变量,其实一个类模板特化basic_string<char>的对象。类模板basic_string定义在头文件<string>中,并在命名空间std中使用typedef或using声明为basic_string<char>设置一个别名string所以我们才可以用关键字string来声明一个字符串对象。

初始化string对象

在这里插入图片描述

注意:
string text("HELLO");与string text = "HELLO";是等价的,后者并不是一个赋值操作,而是会隐式的调用拷贝构造函数进行对象初始化的过程。

这里的初始化和赋值的意义并不相同,初始化是在对象创建过程中进行资源的分配,如果初始化失败,则这个对象不存在。而赋值是对一个已存在的对象进行赋值操作,赋值操作失败,对象仍然存在。

区分它们有什么意义吗?有的,兄弟有的。如果将后者看作一个赋值操作,那么编译器会首先调用默认构造函数来创建一个值为空的string对象,然后再对该对象进行赋值操作,这相当于多进行一次“赋值”操作,增加了额外的开销。除此之外,那些没有提供重载的赋值运算符的对象,在使用赋值运算符时,会使用编译器提供的默认的按位赋值运算符(浅拷贝),此时可能会出现二次释放问题(源对象和赋值对象都释放资源的话,其实是对同一份资源进行释放),也可能会导致资源泄漏问题,在赋值过程中直接将源对象的值拷贝到赋值对象中,赋值对象中原来使用的资源并不会被自动释放,此时就产生了资源泄漏。

string对象并不以NULL结尾

与C风格的char*字符串不同,string类不一定是用空字符表示终止的,实现在于使用的平台。

二、字符串的赋值和连接

先来看一段代码:

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

int main()
{
	string str1("cat");
	string str2;
	string str3;

	str2 = str1; // 使用重载的赋值运算符将str1复制到str2
	str3.assign(str1); // 使用成员函数将str1复制到str3

	cout << "str1: " << str1 
		<< "\nstr2: " << str2
		<< "\nstr3: " << str3 << "\n\n";

	// 修改str2和str3
	str2[0] = str3[2] = 'r';

	cout << "After modification of str2 and str3:\n"
		<< "str1: " << str1
		<< "\nstr2: " << str2
		<< "\nstr3: ";

	// 使用成员函数at
	for (size_t i = 0; i < str3.size(); ++i)
	{
		cout << str3.at(i);
	}

	string str4(str1 + "egroy"); // 拼接对象str1,并用该拼接字符串为str4初始化
	string str5;

	str3 += "pet";
	str1.append("alog");

	str5.append(str1, 4, str1.size() - 4);

	cout << "\n\nAfter concatenation:\nstr1: " << str1
		<< "\nstr2: " << str2
		<< "\nstr3: " << str3
		<< "\nstr4: " << str4
		<< "\nstr5: " << str5 << endl;
}

运行结果:

在这里插入图片描述
上面代码中使用了string对象的多种成员函数,比如,at函数,该函数会返回一个字符串指定位置字符的引用,并且该成员函数与使用下标运算符[]最大的区别在于,成员函数版本会自动检查边界,如果出现越界访问,会抛出一个out_of_range异常。

至于其他的成员函数可以cppreference网站中查看。

三、字符串的成员函数

对于string对象的比较,与C语言中字符串只能使用strcmp或strncmp之类的函数(在string中的比较成员函数为compare)进行比较之外,还可以使用类模板中提供的重载关系运算符(如<、>)来进行比较。

值得一提的是成员函数compare提供两个子串的比较,例如,现在要比较对象str1和对象str2中的指定子串是否相同,str1.compare(2, 5, str3, 0, 5);,这条语句表示比较字符串str1从下标为0的字符起的5个字符和字符串str3从下标为2的字符起的5个字符是否相等。还有str1.compare(0, str3.size(), str3);则是比较了str1和str3这两个字符串从下标为0的位置起的前str3.size()个字符(如果指定的长度超出的str1的长度,则只比较到str1的终止位置)。

string类中也有获取子串的成员函数——substr。该函数有两个参数,第一个参数指明子串的开始下标,第二个参数指明子串的长度。

string类中还提供了一个交换两个字符串的成员函数,swap,它会交换调用函数的对象和参数指定的对象的值。这对实现字符串排序十分有用。例如,str1.swap(str2);就将str1和str2这个两个字符串交换了位置。

四、string类的特征

string类提供了收集字符串的大小、长度、容量、最大长度和其他特性的成员函数。一个字符串的长度或大小是当前存储在这个字符串对象中的字符数目。一个字符串的容量是指在不获取更多内存的情况下字符串所能存储的最大字符数。

下面代码中展示了利用string类的各种成员函数获取字符串的各个特性的过程:

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

void printStatistics(const string&); 

int main()
{
	string str1;

	cout << "Statistics before input:\n" << boolalpha;
	printStatistics(str1);

	// string类中重载的 >> 运算符与C++标准中的 >> 行为相同
	// 在遇到 空白字符 时会停止一次提取
	// 输入一个句子 String testing
	cout << "\n\nEnter a string: ";
	cin >> str1;
	cout << "The string entered was: " << str1;

	cout << "\nStatistics after input:\n";
	printStatistics(str1);

	cin >> str1;
	cout << "\n\nThe remaining string is: " << str1 << endl;
	printStatistics(str1);

	// 使用成员函数append在str1对象后面追加字符
	str1 += "123456789abcdefghijklmnopqrstuvwxyz987654321";
	cout << "\n\nstr1 is now: " << str1 << endl;
	printStatistics(str1);

	// 使用成员函数resize,重新设置字符串的长度(不是容量)
	str1.resize(str1.size() + 10);
	cout << "\n\nStats after resizing by (length + 10):\n";
	printStatistics(str1);
	// 观察当resize的空间大于当前容量时,是否会增加容量
	str1.resize(str1.size() + 100);
	cout << "\n\nTesting member function resize, obeserve capacity:\n";
	printStatistics(str1);
	cout << endl;
}

void printStatistics(const string& stringRef)
{
	cout << "capacity: " << stringRef.capacity() 
		<< "\nmax size: " << stringRef.max_size()
		<< "\nsize: " << stringRef.size()
		<< "\nlength: " << stringRef.length()
		<< "\nempty: " << stringRef.empty();
}

运行结果:

在这里插入图片描述

五、查找字符串中的子串和字符

string类中有下图所示的查找成员函数
在这里插入图片描述

前两个函数很容易理解,就是找调用成员函数的字符串中与参数指定的字符串相同的子串,一个找第一个,另一个找最后一个。

后面的成员函数,则是在参数中指定一个字符集,并在调用函数的对象中找第一个或最后一个与字符集中某个字符相同的字符。not版本,则是找第一个或最后一个不在集合中的字符。

示例代码:

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

int main()
{
	string str("noon is 12 pm; midnight is not.");
	int location;

	// 找字符串str中的第一个 "is" 和最后一个 "is"
	cout << "Original string:\n" << str
		<< "\n\n(find) \"is\" was found at: " << str.find("is")
		<< "\n(rfind) \"is\" was found at: " << str.rfind("is");

	// 查找字符串str中第一个与字符集合 "ab;" 中相同的字符,这里是 ';'
	location = str.find_first_of("ab;");
	cout << "\n\n(find_first_of) found '" << str[location]
		<< "' from the group \"ab;\" at: " << location;

	// 查找字符串str中最后一个与字符集合 "nos" 中相同的字符,这里是 'o'
	location = str.find_last_of("ab;");
	cout << "\n\n(find_last_of) found '" << str[location]
		<< "' from the group \"ab;\" at: " << location;

	// 找到字符串中第一个不存在于参数指定的字符集合中的字符,这里为 ' '
	location = str.find_first_not_of("noi s");
	cout << "\n\n(find_first_not_of) found '" << str[location]
		<< "'is not contained in \"noi s\" and was found at: " << location;

	// 找到字符串中最后一个不存在于参数指定的字符集合中的字符,这里为 '.'
	location = str.find_last_not_of("noi s");
	cout << "\n\n(find_last_not_of) found '" << str[location]
		<< "'is not contained in \"noi s\" and was found at: " << location;

	// 找到字符串中第一个不存在于参数指定的字符集合中的字符,这里为没有
	location = str.find_first_not_of("noon is 12 pm; midnight is not.");
	cout << "\n\nfind_first_not_of(\"noon is 12 pm; midnight is not.\")"
		<< " returned: " << location << endl;
}

运行结果:

在这里插入图片描述
在使用查找函数查找失败时,函数会返回std::string::npos,这里是-1。

六、在字符串中替换字符

string类中使用erase函数来删除字符,使用replace来替换字符。

下面是示例代码:

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

int main()
{
	string str("The values in any left subtree"
	"\nare less than the value in the"
	"\nparent node and the values in"
	"\nany right subtree are greater"
	"\nthan the value in the parent node");

	cout << "Original string:\n" << str << "\n\n";

	// 删除参数指定位置之后的字符,如果有两个参数,第二个参数表示删除的字符个数
	// 没有指定则默认删除到最后一个字符
	str.erase(62);

	cout << "Original string after erase:\n" << str
		<< "\nAfter first replacement:\n";

	size_t position = str.find(" "); // 找字符串中第一个空格字符
	// 将字符串中所有的空格字符替换成 '.'
	while (position != string::npos)
	{
		// 将从position下标开始的1个元素替换成'.'
		str.replace(position, 1, ".");
		position = str.find(" ", position + 1); // 从position + 1位置进行查找下一个空格
	}

	cout << str << "\nAfter second replacement:\n";

	// 使用字符作为参数表示只找与该参数相同的字符
	position = str.find('.');
	while (position != string::npos)
	{
		// 将'.'起的两个字符替换成参数中指定字符串中下标为5开始的2个字符
		// 也就是 ";;"
		str.replace(position, 2, "xxxxx;;yyy", 5, 2);
		position = str.find('.', position + 1);
	}
	cout << str << endl;
}

运行结果:

在这里插入图片描述

七、在字符串中插入字符

要想向一个string对象中插入字符,可以使用insert成员函数,下面我们来看看示例代码:

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

int main()
{
	string str1("beginning end");
	string str2("middle ");
	string str3("12345678");
	string str4("xx");

	cout << "Initial strings:\nstr1: " << str1
		<< "\nstr2: " << str2
		<< "\nstr3: " << str3
		<< "\nstr4: " << str4 << "\n\n";

	// 在str1的下标10处插入str2
	str1.insert(10, str2);

	// 将str4.substr(0, string::npos)
	// substr的第二个参数表示子串的长度,
	// 如果它为string::npos,这里string类中的静态数据成员,它的值为-1,
	// 它的含义取决于上下文,在这里表示str4.substr(0, size())
	// 所以下面的语句表示将str4整个字符串插入到str3的下标为3字符处
	str3.insert(3, str4, 0, string::npos);

	cout << "Strings after insert:\nstr1: " << str1
		<< "\nstr2: " << str2
		<< "\nstr3: " << str3
		<< "\nstr4: " << str4 << "\n\n";
}

运行结果:

在这里插入图片描述

八、转换成C风格的基于指针的char*字符串

前面我们提到了一个string的对象,并不一定是以空字符结尾,所以要将一个string对象转换成一个C风格的字符串,下面使用到的函数copy和c_str是非常重要的。在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

示例代码:

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

int main()
{
	string str("STRINGS");
	const char* ptr1 = nullptr;
	size_t length = str.size();
	char* ptr2 = new char[length + 1]; // 额外分配一个字节的空间用于存储char*字符串的结束空字符

	// copy只有一个版本,
	// 接收三个参数,第一个为一个char类型的指针,用于保存字符串
	// 第二个为拷贝的子串的长度,第三个为拷贝开始位置
	// 该函数不会自动在拷贝的字符串尾部添加空字符,需要手动添加
	str.copy(ptr2, length, 0);
	ptr2[length] = '\0'; // 手动为char*字符串添加结束字符

	cout << "string str is " << str
		<< "\nstr converted to a pointer-based string is "
		<< str.c_str() << "\nptr1 is ";

	// 在C++11之后,该函数一定返回一个带有空字符的字符串
	ptr1 = str.data();
	cout << ptr1 << "\nptr2 is " << ptr2 << endl;
}

运行结果:

在这里插入图片描述

九、迭代器

与容器一样string类中提供迭代器来访问字符串。迭代器提供类似指针运算的语法来访问单个字符,并且与指针一样,迭代器并不会进行范围检查。下面是关于string类中迭代器使用的示例代码:

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

int main()
{
	string str("Testing iterators");
	// 使用作用域分辨运算符指明const_iterator是在string类中被定义
	// const_iterator是string类中的一个嵌套类型
	string::const_iterator iterator = str.begin(); 

	cout << "str = " << str
		<< "\n(Using iterator) str is: ";

	while (iterator != str.end())
	{
		// 像使用指针一样使用 * 运算符来解引用一个迭代器来获得它指向的值
		cout << *iterator;
		++iterator; // 将迭代器指向下一个字符
	}
	cout << endl;
}

运行结果:

在这里插入图片描述

上面代码中循环可以使用基于范围的for语句来替换,因为string对象提供迭代器。

十、字符串流处理

类istringstream支持从字符串输入,类ostringstream支持输出到一个字符串。它们是由typedef定义的别名,它们实际上是:
typedef basic_istringstream<char> istringstream;
typedef basic_ostringstream<char> ostringstream;

这两个类模板提供与istream和ostream及其他用于内存中格式化的成员函数一样的功能。
使用内存中格式化的程序必须包含<sstream>和<iostream>头文件。

ostringstream的演示

示例代码:

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

int main()
{
	ostringstream outputString;

	string str1("Output of several data types ");
	string str2("to an ostringstream object:");
	string str3("\n        double: ");
	string str4("\n           int: ");
	string str5("\naddress of int: ");

	double doubleValue = 123.45678;
	int intValue = 22;

	outputString << str1 << str2 << str3 << doubleValue 
		<< str4 << intValue << str5 << &intValue;

	// 调用basic_ostringstream类中的成员函数str,
	// 该函数的作用是返回对象中的字符串
	// 或是修改对象中的字符串(两个版本)
	// 此处是返回对象中的字符串
	cout << "outputString contains:\n" << outputString.str();

	outputString << "\nmore characters added";
	cout << "\n\nAfter additional stream insertions,\n"
		<< "outputString contains:\n" << outputString.str() << endl;

	outputString.str("Testing memeber function str");
	cout << "\n\nUsing member function str(\"Testing memeber function str\") replace contents in outputString:\n"
		<<  outputString.str() << endl;
}

运行结果:

在这里插入图片描述

istringstream的演示

示例代码:

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

int main()
{
	string input("Input test 123 4.7 A");
	// 将字符串对象input中内容读入流对象inputString中
	istringstream inputString(input); // 默认模式为ios_base::in
	string str1;
	string str2;
	int integerValue;
	double doubleValue;
	char characterValue;

	// 将流中数据存入内存中
	inputString >> str1 >> str2 >> integerValue >> doubleValue >> characterValue;

	cout << "The following items were extracted\n"
		<< "from the istringstream object:" << "\nstring: " << str1
		<< "\nstring: " << str2 << "\n   int: " << integerValue
		<< "\ndouble: " << doubleValue << "\n  char: " << characterValue;

	long value;
	// 尝试从一个空流中读取数据
	inputString >> value;

	// good函数继承自basic_ios类
	// 如果最近一次流上的I/O操作成功,则返回true,反之则返回false
	// 这里则是判断从inputString流中想要读取一个long类型的数据的操作是否成功
	if (inputString.good())
	{
		cout << "\n\nlong value is: " << value << endl;
	}
	else
	{
		cout << "\n\ninputString is empty" << endl;
	}
}

运行结果:

在这里插入图片描述

十一、C++11数值转换函数

将数值转化为字符串对象

C++11的to_string函数(<string>中包含)返回参数数值所代表的字符串。例如cout << str.to_string(100);,这条语句将会以字符串的形式输出100。

在这里插入图片描述

将字符串对象转化为数值

C++中提供了几个将字符串对象转化成数值的函数

在这里插入图片描述

它们接收三个参数第一个参数是要转化的字符串,第二个(nullptr)和第三个(10)都有默认实参,第二个是一个用于保存开始转化的位置的引用,如果为nullptr,则表示不记录开始位置;第三个表示转化的目标数值的进制。

这些函数会忽略字符串最前面的空白字符,直到遇到第一个非空白字符才开始转化,在转化时需要判断字符串的形式是否符合要求:

  • 有正号(+)或负号(-);(没有也可以默认为正)
  • 在第三个参数base为8或0(函数自动判断进制,前缀为0则为八进制,前缀为0x或0X则为十六进制,其他的为十进制)时,前缀为0;
  • 前缀为0x或0X;
  • 为一连串数字

其余情况皆出错,例如,字符串中第一个不为空白字符的字符是非数值字符(比如‘a’),此时会抛出invalid_argument异常,如果返回的值超过了该类型对应的范围,将会抛出out_of_range异常。

华为IC岗笔试刷题含答案(2) 又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。 阅读详情

相关推荐

[MTK][Android P]如何去掉差分包中的preloader分区

最近碰到一个问题,在进行差分升级的时候,会因为某些原因导致preloader hash值不匹配,升级失败,所以需要在差分升级的时候不升级preloader。 解决的方法,就是在制作AB分区的差分升级包的时候,把目标zip解压出来,把ab_partitions.txt中的分区名去掉,同时把preloader.img去掉 修改如下: Project/build/tools/releasetool...

thonmin的专栏 1434

字符串流

 文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据读入。字符串流也称为内存流。 字符串流也有相应的缓冲区,开始时流缓冲区是空的。如果向字符数组存入数据,随着向流插入数据,流缓冲区中的数据不断增加,待缓冲区满了(或遇换行符),一起存入字符

wyl4138的博客 1630

【ESP32开发】——开发环境搭建(VSCode+PlatformIO)

本章内容主要介绍ESP32的开发环境搭建(基于VSCode+PlatformIO)的流程与相应的注意事项,避免开发ESP32止于环境搭建!在项目的维护过程中,可以更好地管理和更新代码、调试问题,并且能够快速适应和采用新的功能、库或硬件平台。:VSCode 的代码提示和自动补全功能,以及 PlatformIO 的管理工具,都能帮助你编写规范、格式良好且易于阅读的代码。:Arduino 框架是一种简单、易用的嵌入式开发框架,适用于快速原型开发和小型项目。需要选择对应自己开发的开发板型号。

m0_61934621的博客 8415

C++字符串流stringstream与string知识介绍与用法小结

之前总结了C++的文件输出输入流的相关知识,通过介绍底层的streambuf缓冲区,从而与stringstream流(字符串流)联系了起来,本文就对此进行简单的介绍。 首先介绍string。 string 是 C++ 提供的字符串类,和 C 类型的字符串相比,除了有不限长度的优点外,还有其他许多方便的功能,其可以看成类似STL里vector数组的一种容器,可以方便的进行数据的增删改查,并可以进行...

不想不努力的博客 3万+

算法面经手撕系列(2)--手撕BatchNormlization

手动实现/手撕BatchNormlization

罟霖同学的站点 865

电机驱动技术中关于磁阻转矩生成的理解

正交在物理学和数学中指的是两个方向或两个向量之间的夹角为90°(直角)。在图中,当气隙磁场的轴线与转子轴线的夹角为90°时,我们称它们为正交。转子磁极的方向。通常由转子的磁极中心指向另一极的连线表示。转子轴线用图示中的d 轴表示。通过对定子、转子、气隙磁场、磁力线的理解,我们可以清晰地分析不同角度下电磁转矩的方向。这种分析不仅有助于电机的理论学习,还能为实际设计提供重要参考。掌握这些基础知识后,可以更好地理解电机工作原理及优化其性能。

weixin_48327795的博客 2074

【STL21】C++中的stringstream(字符串流)

stringstream是C++中非常有用的工具,可以方便地处理字符串的输入和输出。通过将字符串与流对象相关联,我们可以轻松地将字符串数据转换为其他类型(如整数或浮点数),或者将其他类型的数据转换为字符串。参考1、C++ STL 容器库 中文文档2、STL教程:C++ STL快速入门3、4、5、WIKI教程_C ++标准库_C++ Library -

junxuezheng的博客 2823

闲人闲谈PS之一项目库存跨公司业务STO解决方案--SAP闲人的开篇

写这篇文章之前,简单说一下发这篇文章的动机。也算是在SAP这一行干了快10多年,在对一个模块了解越来越深入,越发觉自己的SAP知识浅薄。总的来说,和多数顾问一样,对于**标准功能**的应用业务场景理解还是存在或多或少的知识盲区。 因为一个偶然,看到SAP团子君的文章,分享了很多干货文章。这也是自己一直想做的时候,不管水平高低与否,分享本身就意味着提升。好了废话不多说,先在优快云上发一篇吧,困惑自己将近10年的问题的解决方案。 业务场景:在项目型企业中,通常会有这样的业务,母公司和客...

SAP闲人的博客 9267

C++学习23:C++字符串流

C++字符串流

1543

SAP-PP MD04详解一

MD04是SAP运行MRP后的结果查询事务码,其他功能强大,标准功能比如:查询/更改物料主数据、转换计划订单到生产订单/采购申请、查询/更改各个MRP元素对应的单据等等。而且还可以附加标准的菜单或者自定义添加事务码上去。老铁将做一个MD04详细说明系列,本篇为第一篇之MRP元素说明。 我们来看看MD04基本界面 可以看到主要的数据显示界面,有日期、MRP元素、MRP元素数据、再计划日期、收货/需求、可用数量、工厂、库存地点等栏位。光标定位到MRP元素列,按F1即可看到各类MRP元素的说...

weixin_52158549的博客 1万+

LVGL 蜂巢气泡菜单(Hex Menu)

h。

摸鱼专家 176

【C++】stringstream类 最全超详细解析(什么是stringstream? stringstrem有哪些作用? 如何在算法中应用?)

想必大家在做 LeetCode 算法题的时候会经常看到有使用 stringstream 类 处理字符串,由于自己对这个类不是很了解,查了资料在这里记录一下。 所以本文通过收集资料将其进行总结,主要介绍如何使用 stringstream 处理在算法练习或竞赛中遇到的输入输出问题。

weixin_45031801的博客 5万+

在STM32F103RBT6微控制器上利用USB虚拟Com端口技术,高效实现ADC数据传输:详细操作步骤与示例代码解析

以上就是在STM32F103RBT6上使用USB虚拟Com端口实现ADC数据传输的全部内容。虽然过程中有很多步骤和细节需要注意,但只要按照步骤来,理解每一段代码的作用,就完全可以掌握这个过程。在实际应用中,我们可能需要根据实际需要修改一些代码,如调整ADC的参数,改变数据的处理方式等。但是,只要理解了这个过程,我们就可以很灵活地进行修改。希望这篇文章对你有所帮助。如果你有任何疑问,欢迎在评论区留言,我会尽我所能进行解答。

qq_38334677的博客 1168

C/C++开发,无可避免的IO输入/输出(篇三).字符串流(内存流)IO处理

C/C++开发,无可避免的IO输入/输出(篇三).字符串流(内存流)IO处理,介绍字符串流系列类stringstream/istringstream/ostringstream的继承体系、缓冲方式、打开格式、开发运用等内容,给出完整演示源代码。

技术需要分享 2034

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

string类和字符串流深入剖析

string类和字符串流深入剖析简介字符串赋值和连接字符串比较字串交换字符串大小,长度,容量,最大长度,及其他特性查找string的子串和字符字符串中替换和插入字符转成C风格基于指针的字符串迭代器字符串流处理字符串数值转换函数数值转换为字符串对象字符串对象转换为数值把字符串转换为整型的函数把字符串转换为浮点型的函数 简介 初始化string对象 string text("Hello"); string name(8, 'x'); // 8 chars of 'x' string m

weixin_44433038的博客 865

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c++ string类 流处理(字符串的输入输出和基础函数简介)

使用string 类需要包含头文件: #include<string> 初始化方法: #include<iostream> #include<string> using namespace std; int main() { string s1("hello"); string month="March"; string s2(8,'x'...

饮酒在风里的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++中的字符串流详解<iostream>,<sstream>

注:本文只详解C++中的#include <iostream> ,#include <sstream>,暂不详解#include <fstream>。等后期博主会补充。 与 C 类似,C++ 不具有内置输入/输出功能。 但是,所有 C++ 编译器都捆绑了一个系统的、面向对象的 I/O 包,称为 iostream 类。 该流是 iostream 类中的核心概念。...

一丁的博客 7494

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 236

选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP

本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。

ACP广源盛的博客 220

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 389

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 334

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 377

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 343

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 303

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 436

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 200
上一篇: C++学习-入门到精通【17】自定义的模板化数据结构
下一篇: C++学习-入门到精通【19】杂项汇总
YKPG
博客等级 码龄6年 344粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值