当前位置: 首页 > news >正文

C++标准库容器类——string类

引言

在c++中,string类的引用极大地简化了字符串的操作和管理,相比 C 风格字符串(char*或cahr[]),`std::string` 提供了更高效和更安全的字符串操作。接下来让我们一起来深入学习string类吧!

1.string 的构造与初始化

     - 介绍 string类 的几种常见的构造方式:
     - 默认构造:创建空字符串。
     - 通过 C 风格字符串初始化:`std::string s("Hello");`
     - 复制构造:从另一个字符串构造。
     - 指定字符和长度构造:`std::string s(5, 'A');

using namespace std;   string s1; // 空字符串string s2("Hello"); // 通过 C 风格字符串初始化string s3(s2); // 复制构造string s4(5, 'A'); // 重复字符构造 // "AAAAA"`

2.string的迭代器支持

在 C++ 中,迭代器(Iterator)是一种抽象概念,用来遍历容器中的元素。std::string 作为标准库中的容器类,支持迭代器,使得我们可以像操作其他 STL 容器(如 vector、list 等)一样,使用迭代器来遍历和操作字符串。

(1)什么是迭代器?

迭代器可以理解为一个指针,它指向容器中的某个元素,通过迭代器我们可以逐个访问容器中的元素。不同于普通指针,迭代器具备更强的泛化性,能适用于不同的容器。对 std::string 来说,迭代器可以用于遍历字符串中的每个字符。

(2)std::string 的迭代器类型

string 提供了几种常见的迭代器类型:

string::iterator:正向迭代器,用于从字符串的起始位置向末尾遍历。

string::const_iterator:常量正向迭代器,和 iterator 类似,但它不允许修改迭代器指向的元素。

string::reverse_iterator:反向迭代器,用于从字符串末尾向前遍历。string::const_reverse_iterator:常量反向迭代器,反向遍历并且不允许修改元素。

(3)常用的迭代器操作

begin():返回指向字符串第一个字符的正向迭代器。

end():返回指向字符串末尾之后位置的正向迭代器(即超尾迭代器,不指向实际元素)。rbegin():返回指向字符串最后一个字符的反向迭代器。

rend():返回指向字符串第一个字符之前位置的反向迭代器。

cbegin() 和 cend():常量正向迭代器,保证字符串内容不可修改。

crbegin() 和 crend():常量反向迭代器。

#include <iostream>
#include <string>
using namespace std;int main() {string str1 = "Hello World";// 使用正向迭代器遍历字符串string::iterator it1 = str1.begin();while ( it1 != str1.end() ) {cout << *it1 << " ";  // 输出每个字符++it1;}cout << endl;// 通过正向迭代器修改字符串string::iterator it2 = str1.begin();while ( it2 != str1.end()) {(*it2)++;//所有字符替换为下一个cout << *it2 << " ";// 输出修改后的字符串++it2;}cout << endl;// 使用常量正向迭代器遍历字符串const string str2(str1);string::const_iterator it3 = str2.cbegin();while ( it3 != str2.cend()) {//*(it3)++;cout << *it3 << " ";  // 输出每个字符,但不能修改++it3;}cout << endl;// 使用反向迭代器遍历字符串string::reverse_iterator rit = str1.rbegin();while ( rit != str1.rend()) {cout << *rit << " ";  // 反向输出字符串++rit;}cout << endl;return 0;
}

3.常用成员函数

3.1.获取字符串长度:

size()和 length()作用相同,都用于返回字符串的长度,返回类型都是size_t。

#include <iostream>
using namespace std;int main()
{string s = "Hello";cout << s.size() << endl;//5cout << s.length() << endl;//5return 0;
} 5

两者没有功能上的区别,提供两个概念主要是为了与开发者的习惯保持一致,size_t()更符合容器类的术语,length()更符合处理字符串的自然语言概念

3.2. 访问和修改字符串:

std::string::at() 是 C++ 标准库中std::string类的成员函数,用于安全地访问字符串中的指定字符。它会根据提供的索引返回该索引位置的字符同时会进行越界检查,如果索引超出了字符串的范围,则会抛出 `std::out_of_range` 异常。

相比直接使用下标运算符 `[]`,`at()` 的优势在于它提供了边界检查,从而避免访问无效位置导致未定义行为。

 3.3.1函数原型

char& at(size_t pos);
const char& at(size_t pos) const;

- pos:要访问的字符的索引,size_t类型。
- 返回值:pos位置处的字符。如果at()被用于常量字符串,它返回const char&,否则返回 char&。

3.2.2与 `[]` 运算符的区别

- at():会检查索引是否超出范围,如果超出,抛出 std::out_of_range异常,程序可以捕获该异常。用于安全地访问和修改字符串中的字符,推荐在需要安全性和健壮性时使用。

- []:不进行越界检查,如果访问超出范围的索引,行为是未定义的,可能导致程序崩溃或错误。在确定索引合法的情况下使用。 

3.2.3示例代码

#include <iostream>
using namespace std;int main() {string str = "Hello, World!";// 使用 at() 访问字符串中的字符cout << "字符串的第一个字符:" << str.at(1) << endl; // 输出 'e'// 修改字符串中的字符str.at(7) = 'C'; // 将 'W' 修改为 'C'cout << "修改后的字符串:" << str << endl;try {// 尝试访问超出范围的字符,抛出异常char ch = str.at(20);cout << ch << endl;}catch (const out_of_range& e) {// 捕获 out_of_range 异常cout << "Out of range error:" << e.what() << endl;}return 0;
}

 
3.3. 拼接字符串:

在 C++ 中,拼接字符串的方式有很多,其中比较常用的方式包括使用 `+` 运算符(通过 `operator+` 重载实现)以及 `append()` 函数。虽然它们的作用都是拼接字符串,但它们有不同的使用场景和性能特点。

3.3.1使用 + 运算符(operator+)

+ 运算符是 C++ 中常用的拼接字符串的方法。它通过重载 `operator+` 来实现两个字符串的拼接操作。

int main() 
{string str1 = "Hello";string str2 = "World";// 使用 + 运算符拼接字符串string result = str1 + ", " + str2 + "!";cout << "Result: " << result << endl; // 输出 "Hello, World!"return 0;
}

3.3.2使用append()方法

append()是 std::string 类的成员函数,用于将另一个字符串或字符拼接到当前字符串的末尾。相比于 + 运算符,append() 更加灵活,允许指定拼接的范围,甚至拼接部分字符串。

#include <iostream>
using namespace std;int main() 
{string str1 = "Hello";string str2 = "World";// 使用 append() 拼接字符串str1.append(", ").append(str2).append("!");//从str1的“,”开始拼接到str2的“!”cout << "Result: " << str1 << endl; // 输出 "Hello, World!"return 0;
}

 

3.3.3+ 和 append() 的对比

1.可读性:
- + 运算符更加直观,拼接字符串时看起来像数学加法,代码简洁、易读,尤其是在拼接多个字符串时。
- append() 在一些场景下也很方便,尤其是需要逐步对同一个字符串进行修改时。

2 .性能:
- + 运算符会创建临时字符串对象。在连续使用 + 运算符时,C++ 可能会创建多个临时对象,特别是当涉及多个拼接操作时,临时对象会占用额外的内存,影响性能。

 string result = str1 + str2 + str3;  // 可能生成多个临时对象

- append()则直接修改原字符串对象,不会生成临时对象,因此在多次拼接操作时性能更优。例如,如果你需要不断往同一个字符串中追加内容,`append()` 会比 `+` 更高效。

3. 灵活性
- + 运算符简单直观,但只支持完整字符串或字符的拼接,不能直接拼接部分字符串。
- append() 则可以指定拼接字符串的子串或部分字符,这在需要精细控制拼接内容时非常有用。
  
  示例:拼接部分字符串

  string str1 = "Hello";string str2 = "World!!!";// 拼接 str2 的前 5 个字符str1.append(str2, 0, 5);  // 拼接 "World"cout << str1 << endl;  // 输出 "HelloWorld"

3.3.4append() 的其他用法

1. 拼接字符串:
str1.append(str2);  // 将 str2 拼接到 str1 后面2. 拼接子串:
str1.append(str2, pos, len);  // 将 str2 中从位置 pos 开始的 len 个字符拼接到 str13. 拼接字符数组:
str1.append("World", 5);  // 将 "World" 的前 5 个字符拼接到 str14. 拼接单个字符:
str1.append(1, '!');  // 将字符 '!' 拼接到 str1 后面

3.3.5总结

- + 运算符:简单易用,适合少量字符串的拼接,代码更简洁,但在大量拼接操作中性能可能不如 append()。
- append():性能更优,灵活性更强,尤其适用于频繁拼接的场景,可指定拼接部分字符串或字符。

在选择使用 + 还是 append() 时,可以根据代码的可读性需求和性能要求做出权衡。如果拼接操作复杂或频繁,append()是更好的选择。


3.4.查找、替换与截取:

可以通过结合find()、substr()以及replace()函数,实现字符串的查找、截取和替换。

3.4.1查找子串

如前面所述,使用`find()`函数可以查找子串的位置。

#include <iostream>
using namespace std;int main() {string str = "Hello, World!";string toFind1 = "Worlda";string toFind2 = "World";size_t found1 = str.find(toFind1);size_t found2 = str.find(toFind2);if (found1 != string::npos) {cout << "Found at position: " << found1 << endl;}else {cout << "Not found" << endl;}if (found2 != string::npos) {cout << "Found at position: " << found2 << endl;}else {cout << "Not found" << endl;}return 0;
}

3.4.2截取字符串

使用`substr()`可以从查找到的位置开始截取指定长度的子串。

string substr (size_t pos = 0, size_t len = npos) const;
#include <iostream>
using namespace std;int main() {string str = "Hello, World!";size_t start = 7; // 从第7个字符开始size_t length = 5; // 截取5个字符string sub = str.substr(start, length);cout << "截取的字符串: " << sub << endl;return 0;
}

3.4 3.替换字符串

使用replace()函数可以替换子串。replace()的使用方法是:

string.replace(position, length, new_string);

其中position是替换的起始位置,length是要替换的字符长度,new_string是用于替换的字符串。

#include <iostream>
using namespace std;int main() {string str = "Hello, World!";string toReplace = "World";string replacement = "C++";size_t found = str.find(toReplace);if (found != string::npos) {// 在位置 found 替换长度为 toReplace.length() 的子串str.replace(found, toReplace.length(), replacement);}cout << "替换后的字符串:" << str << endl;return 0;
}

3.5其他成员函数

string的成员函数太多,我们在此就不详细说明了,其他还有很多重要的成员函数,我们简单介绍一下功能,其它还需要小伙伴们自己深入学习。

3.5.1string 类对象的容量操作

3.5.2string类对象的访问及遍历操作 

3.5.3string类对象的修改操作

3.5.4string类非成员函数 

更多string的成员函数:string - C++ Reference (cplusplus.com)

4.auto和范围for

1.auto

(1) auto是c++11引入的一种类型推导关键字,允许编译器自动推导变量的类型,它通过从变量的初始化表达式中推出具体类型 auto 声明的变量必须由编译器在编译时期 推导而得
(2)用 auto 声明指针类型时,用 auto auto* 没有任何区别,但用 auto 声明引用类型时则必须加 &。
(3)当在同一行声明多个变量时这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际 只对第一个类型进行推导,然后用推导出来的类型定义其他变量
(4)auto 不能作为函数的参数可以做返回值,但是建议谨慎使用
(5)auto 不能直接用来声明数组
(6)使用auto声明的变量声明时必须初始化。
#include <iostream>
using namespace std;int func1()
{return 10;
}
// 不能做参数
//void func2(auto a)
//{}// 可以做返回值,但是建议谨慎使用
auto func3()
{return 3;
}
int main()
{int a = 10;auto b = a;auto c = 'a';auto d = func1();// 编译报错,必须初始化//auto e;cout << typeid(b).name() << endl;intcout << typeid(c).name() << endl;charcout << typeid(d).name() << endl;intint x = 10;auto y = &x;auto* z = &x;auto& m = x;cout << typeid(x).name() << endl;intcout << typeid(y).name() << endl;int*cout << typeid(z).name() << endl;int*cout << typeid(m).name() << endl;intauto aa = 1, bb = 2;// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型//auto cc = 3, dd = 4.0;// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型//auto array[] = { 4, 5, 6 };string s1("hellow world");//string::reverse_iterator rit = s1.begin();auto rit = s1.begin();while (rit != s1.end()){cout << *rit << " ";++rit;}cout << endl;return 0;
}

2.范围for 

范围for是C++11引入的一种简化的遍历容器元素的方式,它极大地简化了传统的基于索引或迭代器的循环结构,是代码更加简洁明了。

基本语法:

for ( declaration : range_expression ) 
{// 循环体
}
declaration:表明元素的声明,可以是值、引用或常量引用。
range_expression:表示一个可遍历的对象。
示例代码:
int main()
{//数组三种遍历方式//下标[],迭代,返回for//自动取容器的数据赋值给左边的值//自动++,自动判断结束//原理:范围函数底层是迭代器for (auto ch : s1){cout << ch << " ";}cout << endl;//修改for (auto& ch : s1){ch++;}cout << endl;//修改后的字符串for (auto ch : s1){cout << ch << " ";}cout << endl;int a[] = { 1,2,3,4,5,6,7 };for (auto i : a){cout << i << " ";}return 0;
}

5. string内存管理与性能

C++ 提供了标准库中的 `std::string` 类来简化字符串操作,但其内存管理背后有许多细节值得注意。以下是内存管理与性能优化相关的几个关键点:

1. std::string内存管理机制

(1)动态内存分配:std::string是基于动态内存分配的。它会在需要时自动扩展容量。这意味着当字符串增长时,可能会重新分配内存并复制已有的内容到新位置。这种操作代价较高,特别是在频繁追加内容时。


(2)内存释放:当 string 对象超出作用域或被销毁时,其占用的内存会自动被释放。这是通过 C++的自动内存管理机制(RAII,Resource Acquisition Is Initialization)实现的。

void someFunction() {std::string localString = "Local string";// 做一些其他操作
} // localString 在这里被销毁,其内存被释放。

(3)小字符串优化(SSO, Small String Optimization):为了避免频繁的动态分配开销,许多现代的 C++ 实现采用了小字符串优化机制。当字符串很短(通常少于 15-23 个字符,取决于实现)时,std::string 会直接在栈上存储数据,而不需要堆内存分配。

(4)容量管理:`std::string` 通常会分配比实际需要的更多内存,以避免频繁的重新分配。开发者可以通过 `reserve()` 函数预分配足够的内存空间,避免多次分配。

 2. 性能优化技巧

(1)预分配内存:如果你知道字符串的大致大小,可以使用 `reserve()` 函数预分配内存,减少多次动态内存分配。例如,在大量 `push_back` 操作前调用 `reserve()`。

(2)避免不必要的复制:尽量避免在不必要的情况下拷贝 `std::string` 对象。可以通过使用引用(如 `const std::string&`)或 C++11 之后的右值引用来减少复制的开销。

  void process(const std::string& str);  // 避免拷贝void process(std::string&& str);       // 接收右值引用,支持移动语义

(3)使用 `std::move` 优化:C++11 引入了移动语义,可以通过 `std::move()` 转移字符串的所有权,而不再拷贝数据。对于需要返回大字符串的函数,移动语义可以显著提高性能。

  std::string create_large_string() {std::string str = "large_string_data";return std::move(str);  // 避免拷贝}

(4)拼接字符串时注意效率:在拼接大量字符串时,直接使用 `+` 可能导致多次内存分配和拷贝。为了提高效率,可以考虑使用 `std::ostringstream` 或 `std::string::append()` 来减少不必要的开销。

  std::ostringstream oss;oss << "Hello" << " " << "World!";std::string result = oss.str();

3. 常见的性能陷阱

(1)频繁的小字符串拼接:频繁的小字符串拼接会导致大量的内存分配和释放操作。可以通过 `reserve()` 或使用合适的数据结构(如 `std::ostringstream`)来减少开销。

(2)返回大字符串:如果一个函数返回一个大字符串对象,而没有使用移动语义(C++11 之前),会导致不必要的拷贝。C++11 之后,编译器会优化返回值,但显式使用 `std::move` 更好地表达意图。

(3)过度使用std::string的临时对象**:在某些场景下,频繁生成临时的 `std::string` 对象会导致性能下降。可以通过优化临时对象的使用或通过 `std::string_view` 来避免不必要的临时对象生成。

总结
C++ 的 `std::string` 提供了许多便捷的功能,但在需要处理大量数据或高性能场景下,注意其内存管理机制至关重要。通过合理使用预分配、避免不必要的拷贝、利用移动语义等技术,开发者可以大幅度提高字符串操作的效率。

相关文章:

C++标准库容器类——string类

引言 在c中&#xff0c;string类的引用极大地简化了字符串的操作和管理&#xff0c;相比 C 风格字符串&#xff08;char*或cahr[]&#xff09;&#xff0c;std::string 提供了更高效和更安全的字符串操作。接下来让我们一起来深入学习string类吧&#xff01; 1.string 的构造…...

Qt --- 常用控件的介绍 --- 其他控件

一、QPushButton QWidget中设计到的各种属性/函数/使用方法&#xff0c;针对接下来要介绍的Qt的各种控件都是有效的。 使用QPushButton表示一个按钮&#xff0c;这也是当前我们最熟悉的一个控件了。这个类继承了QAbstractButton&#xff0c;这个类是一个抽象类&#xff0c;是…...

spark读取数据性能提升

1. 背景 spark默认的jdbc只会用单task读取数据&#xff0c;读取大数据量时&#xff0c;效率低。 2. 解决方案 根据分区字段&#xff0c;如日期进行划分&#xff0c;增加task数量提升效率。 /*** 返回每个task按时间段划分的过滤语句* param startDate* param endDate* param …...

一次使用threading.Thread来实现Pytorch多个模型并发运行的失败案例

文章目录 背景我的做法&#xff08;但证明不起效果&#xff09; 背景 我有多个pytorch GPU模型&#xff0c;他们有不同的参数&#xff08;也就是说不是共享的&#xff09;&#xff0c;但是相同的数据输入&#xff0c;想要并发运行。 不并发运行&#xff0c;当然就是循环喽。 …...

HashMap源码

简介 HashMap 是一种基于哈希表的 Map 接口实现&#xff0c;它存储键值对&#xff08;key-value pairs&#xff09;&#xff0c;并允许使用键来快速检索值。在 Java 中&#xff0c;HashMap 是 java.util 包的一部分&#xff0c;它不是同步的&#xff0c;这意味着它不是线程安全…...

探索 Web Speech API:实现浏览器语音识别与合成

引言 Web Speech API 是一项由 W3C 开发的 Web 标准&#xff0c;为开发者提供了在 Web 应用程序中实现语音识别和语音合成的能力。通过 Web Speech API&#xff0c;我们可以让网页与用户进行语音交互&#xff0c;实现更加智能化和便捷的用户体验。本文将深入探讨 Web Speech A…...

python基础题练习

1.可否定义一个sum函数呢&#xff1f;返回指定区间的值的和&#xff1f;例如&#xff0c;区间[1,4]的和为123410返回指定区间值的平方的和呢&#xff1f;立方呢&#xff1f; 代码&#xff1a; # 计算从start到end&#xff08;包括end&#xff09;的所有整数的和。 def sum_ra…...

工业交换机如何保证数据的访问安全

在现代工业自动化环境中&#xff0c;工业交换机作为关键的网络设备&#xff0c;扮演着数据传输和信息交互的重要角色。为了确保数据的访问安全&#xff0c;工业交换机不仅具备高效的转发性能&#xff0c;还集成了多层次的安全防护机制&#xff0c;以抵御各种潜在的网络威胁。 首…...

jmeter得到的文档数据处理

通过前面jmeter得到的输出文档&#xff0c;这里是txt文档&#xff0c;里面包含了很多条数据&#xff0c;每条数据的结构如下&#xff1a; 【request】 uuid&#xff1a;xxxxxxx timestamp&#xff1a;xxxxxxxx No.x question&#xff1a;xxxxxxx 【response】 code&#…...

12- 【JavaWeb】校园快递管理系统-数据库建设

项目概述 开发一个Javaweb校园快递管理系统&#xff0c;包含以下功能&#xff1a; 数据库设计 首先,我们需要设计数据库的表结构。主要包括以下表: 学生表: 存储学生的基本信息&#xff0c;姓名、手机号。快递表: 存储快递的信息&#xff0c;快递单号、收件人、收件人手机号、…...

Windows本地连接远程服务器并创建新用户详细记录

前提可知&#xff1a; &#xff08;1&#xff09;服务器IP地址&#xff1a;x.x.x.x &#xff08;2&#xff09;服务器名称&#xff1a;root&#xff08;一般默认为root&#xff0c;当然也有别的名称&#xff09; &#xff08;3&#xff09;服务器登陆密码&#xff1a;**** 一、…...

【kaggle竞赛】毒蘑菇的二元预测题目相关信息和思路求解代码

毒蘑菇的二元预测 您提供了很多关于不同二元分类任务的资源和链接&#xff0c;看起来这些都是Kaggle竞赛中的参考资料和高分解决方案。为了帮助您更好地利用这些资源&#xff0c;这里是一些关键点的总结&#xff1a; Playground Season 4 Episode 8 主要关注的竞赛: 使用银行…...

Pytest-allure如何在测试完成后自动生成完整报告?

一、完整步骤 常规allure报告的生成方法是在pytest全部用例执行完成后&#xff0c;手动在命令行执行如 allure generate ./temps -o ./report --clean每次用例执行完成后都要重复如此的操作&#xff0c;十分繁琐。 可以使用如下方式让用例执行完成后自动生成报告到当前目录下…...

数据结构-树(基础,分类,遍历)

数据结构-树 1.什么是树&#xff1f; 在计算机科学中&#xff0c;树是一种常用的非线性数据结构&#xff0c;用于表示具有层次关系的数据。与线性数据结构&#xff08;如数组和链表&#xff09;不同&#xff0c;树结构以节点&#xff08;Nodes&#xff09;和边&#xff08;Ed…...

CodeGeeX4:程序员的高效助手,多语言代码生成神器!

你是否曾在编写代码时&#xff0c;为复杂的语法、逻辑错误而绞尽脑汁&#xff1f;或是在面对多个编程语言的切换时&#xff0c;感觉脑子快要爆炸&#xff1f;别担心&#xff01;一款全新的多语言代码生成神器——CodeGeeX4&#xff0c;正悄然成为程序员们的“救命稻草”。它不仅…...

小程序组件间通信

文章目录 父传子子传父获取组件实例兄弟通信 父传子 知识点&#xff1a; 父组件如果需要向子组件传递指定属性的数据&#xff0c;在 WXML 中需要使用数据绑定的方式 与普通的 WXML 模板类似&#xff0c;使用数据绑定&#xff0c;这样就可以向子组件的属性传递动态数据。 父…...

Homebrew安装与切换下载源

一、安装 1.Homebrew的官网地址 https://brew.sh/zh-cn/ 2.执行命令行安装 /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)” 3.无法连接到https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh的地址 解决…...

C#回调函数

1、定义并初始化委托 public delegate void CallbackDelegate(string message);//定义一个委托类型CallbackDelegate callbackDelegate;//声明一个委托对象/// <summary>/// 定义委托对应的函数/// </summary>/// <param name"str"></param>…...

Matplotlib绘制热力图

热力图&#xff08;Heatmap&#xff09;是一种使用颜色来表示数值强度的数据可视化工具。它常用于以下场景&#xff1a; 热力图的适用场景 数据的相关性分析&#xff1a;在统计学中&#xff0c;热力图常用于展示变量之间的相关性&#xff0c;尤其是当数据量较大时&#xff0c;…...

手写SpringMVC

1、开发HspDispatcherServlet 2、完成客户端/浏览器可以请求控制层 目的&#xff1a;发出url请求时&#xff0c;经过前端控制器&#xff0c;找到Monster的List方法&#xff0c;把结果再打回去 3、从web.xml动态获取hspspringmvc.xml 4、完成自定义Service注解功能 目的&…...

mysql学习教程,从入门到精通,SQL 删除数据(DELETE 语句)(18)

1、SQL 删除数据&#xff08;DELETE 语句&#xff09; 在编写SQL中的DELETE语句时&#xff0c;需要非常小心&#xff0c;因为一旦执行&#xff0c;被删除的数据就无法恢复了&#xff08;除非你有备份&#xff09;。DELETE语句用于从数据库表中移除一条或多条记录。这里&#x…...

周边游小程序开发

开发一个周边游小程序是一个既有趣又富有挑战性的项目&#xff0c;它可以帮助用户发现周边的旅游景点、活动、美食和住宿等&#xff0c;提升用户的旅游体验。以下是开发周边游小程序的基本步骤和一些建议&#xff1a; 1.市场调研与需求分析 目标用户定位&#xff1a;确定你的用…...

初级前端面试

1.介绍自己 2.介绍一下之前做过的项目以及接触的业务 3.最近学的技术&#xff0c;接触的是哪一块&#xff08;回答了vue3&#xff09; 4.vue3在什么时候调用接口 beforeCreate 在实例初始化之后&#xff0c;数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 用…...

微软AI核电计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

图片马赛克处理(Java)

1.需求 给图片的指定区域打码给整张图片打码马赛克方格取色支持中心点取色和随机取色马赛克支持灰度处理 2.源码 package com.visy.utils;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOE…...

python+selenium实现自动联网认证,并实现断网重连

pythonselenium实现自动联网认证&#xff0c;并实现断网重连 echo off python “E:\autoD\auto_login.py” 要使自动登录脚本在系统重启后自动运行&#xff0c;你可以使用Windows的任务计划程序来设置。以下是详细的步骤&#xff1a; 1. 保存脚本 首先&#xff0c;将你的Py…...

基于机器学习的注意力缺陷/多动障碍 (ADHD)(python论文+代码)HYPERAKTIV

简述 医疗保健领域的机器学习研究往往缺乏完全可重复性和可比性所需的公共数据。由于患者相关数据附带的隐私问题和法律要求&#xff0c;数据集往往受到限制。因此&#xff0c;许多算法和模型发表在同一主题上&#xff0c;没有一个标准的基准。因此&#xff0c;本文提出了一个公…...

Spring Boot 集成 Redisson 实现消息队列

包含组件内容 RedisQueue&#xff1a;消息队列监听标识RedisQueueInit&#xff1a;Redis队列监听器RedisQueueListener&#xff1a;Redis消息队列监听实现RedisQueueService&#xff1a;Redis消息队列服务工具 代码实现 RedisQueue import java.lang.annotation.ElementTyp…...

go语言Map详解

Map Go语言中提供的映射关系容器为map&#xff0c;其内部使用散列表&#xff08;hash&#xff09;实现 map是一种无序的基于key-value的数据结构&#xff0c;Go语言中的map是引用类型&#xff0c;必须初始化才能使用。 它提供了高效的查找、插入和删除操作&#xff0c;非常适…...

C++——已知数组a[6]={1,3,5,7,9};输入一个数值,要求按照现有排序规律将它放入数组当中。

没注释的源代码 #include <iostream> using namespace std; int main() { int a[6]{1,3,5,7,9}; int n,i,j; cout<<"请输入一个数值&#xff1a;"; cin>>n; for(int i0;i<4;i) { if(n<a[i]) { …...