实验1 现代C++编程初体验

1. 实验任务1

task1源代码:

  1 #include <iostream>
  2 #include <string>
  3 #include <vector>
  4 #include <algorithm>
  5 
  6 using namespace std;
  7 
  8 // 声明
  9 // 模板函数声明
 10 template<typename T>//*****表明这是一个模板参数,可以接受任意类型的参数, 这样的设计使得这个函数具有通用性,可以处理不同类型的数据
 11 void output(const T& c);//******通过常量引用const T& c来传递参数, 避免了不必要的对象复制,函数内部不会修改传入的对象
 12 
 13 // 普通函数声明
 14 void test1();
 15 void test2();
 16 void test3();
 17 
 18 int main() {
 19     cout << "测试1: \n";
 20     test1();
 21 
 22     cout << "\n测试2: \n";
 23     test2();
 24 
 25     cout << "\n测试3: \n";
 26     test3();
 27 }
 28 
 29 // 函数实现
 30 // 输出容器对象c中的元素
 31 template <typename T>
 32 void output(const T& c) {
 33     for (auto& i : c)//auto 关键字进行自动类型推导,& 表示引用
 34         cout << i << " ";//*****在每次循环中,变量 i 会依次被绑定到容器 c 中的一个元素
 35     cout << endl;
 36 }
 37 
 38 // 测试1
 39 // 组合使用算法库、迭代器、string反转字符串
 40 void test1() {
 41     string s0{ "0123456789" };
 42     cout << "s0 = " << s0 << endl;
 43 
 44     string s1{ s0 };//**将 s0 的内容复制到 s1 中
 45     reverse(s1.begin(), s1.end());  // 反转指定迭代器区间的元素
 46     //**********************************************************************************************************************************************
 47     // *********************************C++ 标准库中的 reverse 函数来反转字符串 ***********************************:
 48     //接受两个参数,分别是要反转的范围:起始迭代器和结束迭代器
 49     //begin() 返回指向字符串第一个字符的迭代器,end() 返回指向字符串末尾(*********最后一个字符的下一个位置********)的迭代器
 50     //***********************************************************************************************************************************************
 51     cout << "s1 = " << s1 << endl;
 52 
 53     string s2{ s0 };
 54     reverse_copy(s0.begin(), s0.end(), s2.begin()); 
 55     //*****************************************************************************************************************************************
 56     // 将指定迭代区间的元素拷贝到指定迭代器开始的目标区间,并且在复制过程中反转次序
 57     //接受三个参数:
 58     //前两个参数指定了要复制的源范围:这里是字符串 s0 的起始迭代器和结束迭代器
 59     //第三个参数是目标范围的起始迭代器
 60     //它会从 s0 的末尾开始,逐个字符地复制到 s2 中,从 s2 的起始位置开始放置
 61     //****************************************************************************************************************************************
 62     cout << "s2 = " << s2 << endl;
 63 }
 64 
 65 // 测试2
 66 // 组合使用算法库、迭代器、vector反转动态数组对象vector内数据
 67 //*********************************************************************************************************************************
 68 //C++ 容器类 <vector>
 69 //声明一个 vector:std::vector<int> myVector;
 70 //添加元素:myVector.push_back(10);//将参数(这里是 10)添加到容器 myVector 的末尾
 71 //访问元素:int firstElement = myVector[0];//从名为 myVector 的容器中获取第一个元素,并将其赋值给变量 firstElement
 72 //获取元素数量:size_t size = myVector.size();
 73 //清空 vector:myVector.clear();
 74 void test2() {
 75     vector<int> v0{ 2, 0, 4, 9 };
 76     cout << "v0: ";
 77     output(v0);
 78 
 79     vector<int> v1{ v0 };
 80     reverse(v1.begin(), v1.end());
 81     cout << "v1: ";
 82     output(v1);
 83 
 84     vector<int> v2{ v0 };
 85     reverse_copy(v0.begin(), v0.end(), v2.begin());
 86     cout << "v2: ";
 87     output(v2);
 88 }
 89 
 90 // 测试3
 91 // 组合使用算法库、迭代器、vector实现元素旋转移位
 92 void test3() {
 93     vector<int> v0{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 94     cout << "v0: ";
 95     output(v0);
 96 
 97     vector<int> v1{ v0 };
 98     rotate(v1.begin(), v1.begin() + 1, v1.end());  // 旋转指定迭代器区间[v1.begin(), v1.end())之间的数据项,旋转后从迭代器v1.begin()+1位置的数据项开始
 99     //****************************************************************************************************************************************************
100     // C++ 标准库中的 rotate 算法来旋转一个容器中的元素
101     //这个函数接受三个迭代器参数
102     //第一个参数是旋转范围的起始位置,第二个参数是新的起始位置,第三个参数是旋转范围的结束位置
103     //调用 rotate 函数时,以给定的新起始位置为轴,将元素从该位置之前的部分移动到末尾,同时将该位置之后的部分移动到开头
104     //****************************************************************************************************************************************************
105     cout << "v1: ";
106     output(v1);
107 
108     vector<int> v2{ v0 };
109     rotate(v2.begin(), v2.begin() + 2, v2.end());
110     cout << "v2: ";
111     output(v2);
112 
113     vector<int> v3{ v0 };
114     rotate(v3.begin(), v3.end() - 1, v3.end());
115     cout << "v3: ";
116     output(v3);
117 
118     vector<int> v4{ v0 };
119     rotate(v4.begin(), v4.end() - 2, v4.end());
120     cout << "v4: ";
121     output(v4);
122 }

task1运行截图:

 

 

2. 实验任务2

task2源代码:

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <algorithm>
  5 #include <numeric>
  6 #include <iomanip>
  7 
  8 using namespace std;
  9 
 10 // 函数声明
 11 // 模板函数声明
 12 template<typename T>
 13 void output(const T& c);
 14 
 15 // 普通函数声明
 16 int rand_int_100();
 17 void test1();
 18 void test2();
 19 
 20 int main() {
 21     cout << "测试1: \n";
 22     test1();
 23 
 24     cout << "\n测试2: \n";
 25     test2();
 26 }
 27 
 28 // 函数实现
 29 // 输出容器对象c中的元素
 30 template <typename T>
 31 void output(const T& c) {
 32     for (auto& i : c)
 33         cout << i << " ";
 34     cout << endl;
 35 }
 36 
 37 // 返回[0, 100]区间内的一个随机整数
 38 int rand_int_100() {
 39     return rand() % 101;//rand()函数返回一个伪随机整数
 40 }
 41 
 42 // 测试1
 43 // 对容器类对象指定迭代器区间进行赋值、排序
 44 void test1() {
 45     vector<int> v0(10);  // 创建一个动态数组对象v0, 对象大小为10
 46     //************************************************************************************
 47     //*************C++ 标准库中的 generate 算法
 48     generate(v0.begin(), v0.end(), rand_int_100); // 产生[0, 100]之间的随机整数赋值给指定迭代器区间[v0.begin(), v0.end())内的每个数据项
 49     cout << "v0: ";
 50     output(v0);
 51 
 52     vector<int> v1{ v0 };
 53     //**********升序*****************
 54     sort(v1.begin(), v1.end()); // 对指定迭代器区间[v1.begin(), v1.end())内数据项进行升序排序
 55     cout << "v1: ";
 56     output(v1);
 57 
 58     vector<int> v2{ v0 };
 59     sort(v2.begin() + 1, v2.end() - 1); // 对指定迭代器区间[v1.begin()+1, v1.end()-1)内数据项进行升序排序
 60     cout << "v2: ";
 61     output(v2);
 62 }
 63 
 64 // 测试2
 65 // 对容器类对象指定迭代器区间进行赋值、计算最大值/最小值/均值
 66 void test2() {
 67     vector<int> v0(10);
 68     generate(v0.begin(), v0.end(), rand_int_100);
 69     cout << "v0: ";
 70     output(v0);
 71 
 72     //************* C++ 标准库中的 min_element 算法
 73     auto iter1 = min_element(v0.begin(), v0.end());
 74     cout << "最小值: " << *iter1 << endl;//***************iter1是一个迭代器,而迭代器本质上是一个指针类型的对象,它指向容器中的一个元素
 75     //要获取迭代器所指向的元素的值,就需要使用解引用操作符*
 76 
 77     auto iter2 = max_element(v0.begin(), v0.end());
 78     cout << "最大值: " << *iter2 << endl;
 79 
 80     //************** C++ 标准库中的 minmax_element 算法
 81     //函数返回一个 std::pair 对象,其中 first 成员是指向最小元素的迭代器,second 成员是指向最大元素的迭代器
 82     auto ans = minmax_element(v0.begin(), v0.end());
 83     cout << "最小值: " << *(ans.first) << endl;
 84     cout << "最大值: " << *(ans.second) << endl;
 85 
 86     //**************C++ 标准库中的 accumulate 算法
 87     //它接受三个参数
 88     // 第一个和第二个参数指定了要累加的范围
 89     // 第三个参数是累加的初始值,这里初始值为 0
 90     double avg1 = accumulate(v0.begin(), v0.end(), 0) / v0.size();
 91     cout << "均值: " << fixed << setprecision(2) << avg1 << endl;//**************将其格式化为固定小数点后两位的形式
 92     cout << endl;
 93 
 94     vector<int> v1{ v0 };
 95     cout << "v0: ";
 96     output(v0);
 97     sort(v1.begin(), v1.end());
 98     double avg2 = accumulate(v1.begin() + 1, v1.end() - 1, 0) / (v1.size() - 2);
 99     cout << "去掉最大值、最小值之后,均值: " << avg2 << endl;
100 }

task2运行截图:

 

3. 实验任务3

task3源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 
 5 bool is_palindrome(std::string s);
 6 
 7 int main() {
 8     using namespace std;
 9     string s;
10 
11     while (cin >> s)  // 多组输入,直到按下Ctrl+Z后结束测试
12         cout << boolalpha << is_palindrome(s) << endl;
13 }
14 
15 // 函数is_palindrom定义
16 bool is_palindrome(std::string s) {
17     std::string s_copy{ s };
18     //***************************************std::string s_copy;***************************************
19     // !!!这样写会出现错误!!!
20     // !!!在使用 std::reverse_copy 函数时,确保目标字符串 s_copy 有足够的空间来容纳反转后的内容
21     std::reverse_copy(s.begin(), s.end(), s_copy.begin());
22     return s == s_copy;
23 }

task3运行截图:

 

4. 实验任务4

task4源代码:

  1 #include <iostream>
  2 #include <string>
  3 #include <algorithm>
  4 
  5 std::string dec2n(int x, int n = 2);
  6 
  7 int main() {
  8     using namespace std;
  9 
 10     int x;
 11     while (cin >> x) {
 12         cout << "十进制: " << x << endl;
 13         cout << "二进制: " << dec2n(x) << endl;
 14         cout << "八进制: " << dec2n(x, 8) << endl;
 15         cout << "十六进制: " << dec2n(x, 16) << endl << endl;
 16     }
 17 }
 18 
 19 // 函数dec2n定义
 20 std::string dec2n(int x, int n) {
 21     
 22     if (x == 0) return "0";//首先检查输入的十进制数 x 是否为 0,如果是则直接返回 "0"
 23     
 24     std::string result;//创建一个空字符串 result,用于存储转换后的结果
 25     
 26     //****************************************************************************************************************
 27     //**************************************************取余转换******************************************************
 28     while (x > 0) {//只要 x 大于 0,就继续进行转换
 29         
 30         char digit;
 31 
 32         int remainder = x % n;//x 对 n 取余得到当前的最低位数字
 33         
 34         if (remainder < 10) {
 35             //如果这个余数小于 10,则将其转换为对应的数字字符
 36             digit = remainder + '0';
 37         }
 38         else {
 39             //如果余数大于等于 10,则将其转换为对应的大写字母字符
 40             digit = remainder - 10 + 'A';
 41         }
 42 
 43         //###将得到的字符 digit 添加到结果字符串 result 的开头###
 44         result = digit + result;
 45         
 46         //#############################################字符串插入#############################################
 47         //1.函数 insert ()
 48         /*//将字符串 "abc" 插入到 "Hello" 的索引为 2 (指向第3个字符)的位置,输出 "Heabcllo"
 49             #include <iostream>
 50             #include <string>
 51 
 52             int main() {
 53                 std::string str = "Hello";
 54                 str.insert(2, "abc");
 55                 std::cout << str << std::endl;
 56                 return 0;
 57             }
 58         */
 59 
 60         //2.迭代器插入
 61         /*//将字符 'A' 插入到 "Hello" 的索引为 2 的位置,输出 "HeAllo"
 62             #include <iostream>
 63             #include <string>
 64 
 65             int main() {
 66                 std::string str = "Hello";
 67                 std::string::iterator it = str.begin() + 2;//声明了一个名为 it 的迭代器变量
 68                 //str.begin() + 2:指向字符串中第三个字符(索引为 2 的位置)的迭代器
 69                 str.insert(it, 'A');
 70                 std::cout << str << std::endl;
 71                 return 0;
 72             }
 73         
 74         */
 75 
 76         //3.加法插入
 77         /*//字符串插入字符串
 78         !!!字符和字符串不能直接进行加法运算来插入!!!
 79         !!!把字符转换为字符串,然后再进行拼接操作是可以的!!!
 80         
 81         ###  std::string(1, digit):
 82         “1” 这个参数表示新创建的字符串的长度
 83         “digit” 这个参数是一个字符,它被用作新创建的长度为 1 的字符串的内容
 84 
 85         !!!!!在 C++ 中,单个字符可以隐式转换为长度为 1 的字符串!!!!!
 86         eg.执行 result = digit + result; 时,首先 digit 被隐式转换为一个只包含该字符的临时字符串对象
 87 
 88         !!digit + result和 result + digit不同,左拼接和右拼接!!
 89         */
 90         
 91         //#############################################字符串插入#############################################
 92         
 93         //准备处理下一位数字
 94         x /= n;
 95     }
 96     
 97     /*
 98     例如,将十进制数 10 转换为二进制:
 99     第一次循环:10 % 2 = 0,得到最低位数字 0,此时 result = "0",然后 10 /= 2 = 5。
100     第二次循环:5 % 2 = 1,得到下一位数字 1,此时 result = "10",然后 5 /= 2 = 2。
101     第三次循环:2 % 2 = 0,得到数字 0,此时 result = "010",然后 2 /= 2 = 1。
102     第四次循环:1 % 2 = 1,得到数字 1,此时 result = "1010",然后 1 /= 2 = 0,循环结束,返回 "1010"。
103     */
104 
105     //**************************************************取余转换******************************************************
106     //****************************************************************************************************************
107     
108     return result;
109 }

task4运行截图:

 

 5. 实验任务5

task5源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <iomanip>
 6 
 7 using namespace std;
 8 
 9 template<typename T>
10 void output(const T& c);
11 
12 int main() {
13     vector<char> group1{ ' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
14     output(group1);
15 
16     vector<char> group2{ 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };
17     for (int i = 1; i <= 26;i++) {
18         rotate(group2.begin(), group2.begin() + 1, group2.end());
19         cout << setw(2) << i;
20         output(group2);
21     }
22 }
23 
24 
25 template<typename T>
26 void output(const T& c) {
27     for (auto& i : c)
28         cout << setw(2) << i ;
29     
30     //***********************************************格式化输出***********************************************
31     //********************************************************************************************************
32     
33     //头文件 #include <iomanip>
34     //右对齐 使用 std::setw()
35     //左对齐 使用std::left eg. std::cout << std::left << std::setw(5) << num1 << std::endl;
36     //使用 std::setfill('#') eg. std::cout << std::setfill('0') << std::setw(2) << num << std::endl;
37     //固定小数点后m位 fixed << setprecision(m) eg. std::cout << std::fixed << std::setprecision(2);
38     
39     //********************************************************************************************************
40     //***********************************************格式化输出***********************************************
41     
42     cout << endl;
43 }

task5运行截图:

 

6. 实验任务6

task6源代码:

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <ctime>
 4 #include <iomanip>
 5 
 6 int generateRandomNumber(int min, int max) {
 7     return rand() % (max - min + 1) + min;
 8 }
 9 
10 int main() {
11     srand(static_cast<unsigned int>(time(nullptr)));
12     //使用当前时间作为随机数种子
13 
14     int correctCount = 0;
15     
16     for (int i = 0; i < 10; ++i) {
17         
18         int num1 = generateRandomNumber(1, 10);
19         int num2 = generateRandomNumber(1, 10);
20         int operatornum = generateRandomNumber(1, 4);//利用operatornum来随机计算方式
21         int answer;
22 
23         switch (operatornum) {
24         
25         case 1:
26             std::cout << num1 << " + " << num2 << " = ";
27             answer = num1 + num2;
28             break;
29         
30         case 2:
31             if (num1 < num2) {
32                 int temp = num1;
33                 num1 = num2;
34                 num2 = temp;
35             }
36             std::cout << num1 << " - " << num2 << " = ";
37             answer = num1 - num2;
38             break;
39         
40         case 3:
41             std::cout << num1 << " * " << num2 << " = ";
42             answer = num1 * num2;
43             break;
44         
45         case 4:
46             while (num1 % num2 != 0) {
47                 num2 = generateRandomNumber(1, num1);
48             }
49             std::cout << num1 << " / " << num2 << " = ";
50             answer = num1 / num2;
51             break;
52         }
53         
54         int userAnswer;
55         
56         std::cin >> userAnswer;
57         if (userAnswer == answer) {
58             correctCount++;
59         }
60     }
61 
62     double accuracy = (double(correctCount) / 10) * 100;
63     std::cout << std::fixed << std::setprecision(2);
64     std::cout << "正确率: " << accuracy << "%" << std::endl;
65 
66     return 0;
67 }

task6运行截图:

 

[实验总结]

1.模板函数:可以接受任意类型的参数

2.输出容器对象c中的元素:

1 template <typename T>
2 void output(const T& c) {
3     for (auto& i : c)//auto 关键字进行自动类型推导,& 表示引用
4         cout << i << " ";//*****在每次循环中,变量 i 会依次被绑定到容器 c 中的一个元素
5     cout << endl;
6 }

3.reverse函数

1 reverse(s1.begin(), s1.end());  // 反转指定迭代器区间的元素
2 //**********************************************************************************************************************************************
3 // *********************************C++ 标准库中的 reverse 函数来反转字符串 ***********************************:
4 //接受两个参数,分别是要反转的范围:起始迭代器和结束迭代器
5 //begin() 返回指向字符串第一个字符的迭代器,end() 返回指向字符串末尾(*********最后一个字符的下一个位置********)的迭代器
6 //***********************************************************************************************************************************************

4.reverse_copy函数

1 reverse_copy(s0.begin(), s0.end(), s2.begin()); 
2 //*****************************************************************************************************************************************
3 // 将指定迭代区间的元素拷贝到指定迭代器开始的目标区间,并且在复制过程中反转次序
4 //接受三个参数:
5 //前两个参数指定了要复制的源范围:这里是字符串 s0 的起始迭代器和结束迭代器
6 //第三个参数是目标范围的起始迭代器
7 //它会从 s0 的末尾开始,逐个字符地复制到 s2 中,从 s2 的起始位置开始放置
8 //****************************************************************************************************************************************

值得注意的是:在使用 std::reverse_copy 函数时,确保目标字符串有足够的空间来容纳反转后的内容

1 bool is_palindrome(std::string s) {
2     std::string s_copy{ s };
3     //***************************************std::string s_copy;***************************************
4     // !!!这样写会出现错误!!!
5     // !!!在使用 std::reverse_copy 函数时,确保目标字符串 s_copy 有足够的空间来容纳反转后的内容
6     std::reverse_copy(s.begin(), s.end(), s_copy.begin());

5.C++ 容器类 <vector>

1 //C++ 容器类 <vector>
2 //声明一个 vector:std::vector<int> myVector;
3 //添加元素:myVector.push_back(10);//将参数(这里是 10)添加到容器 myVector 的末尾
4 //访问元素:int firstElement = myVector[0];//从名为 myVector 的容器中获取第一个元素,并将其赋值给变量 firstElement
5 //获取元素数量:size_t size = myVector.size();
6 //清空 vector:myVector.clear();

6.rotate函数

1 rotate(v1.begin(), v1.begin() + 1, v1.end());  // 旋转指定迭代器区间[v1.begin(), v1.end())之间的数据项,旋转后从迭代器v1.begin()+1位置的数据项开始
2 //****************************************************************************************************************************************************
3 // C++ 标准库中的 rotate 算法来旋转一个容器中的元素
4 //这个函数接受三个迭代器参数
5 //第一个参数是旋转范围的起始位置,第二个参数是新的起始位置,第三个参数是旋转范围的结束位置
6 //调用 rotate 函数时,以给定的新起始位置为轴,将元素从该位置之前的部分移动到末尾,同时将该位置之后的部分移动到开头
7 //****************************************************************************************************************************************************

7.generate函数

1  generate(v0.begin(), v0.end(), rand_int_100); // 产生[0, 100]之间的随机整数赋值给指定迭代器区间[v0.begin(), v0.end())内的每个数据项

8.sort函数

1 sort(v2.begin() + 1, v2.end() - 1); // 对指定迭代器区间[v1.begin()+1, v1.end()-1)内数据项进行升序排序

9.min_element函数

1 auto iter1 = min_element(v0.begin(), v0.end());

10.minmax_element函数

1 //************** C++ 标准库中的 minmax_element 算法
2 //函数返回一个 std::pair 对象,其中 first 成员是指向最小元素的迭代器,second 成员是指向最大元素的迭代器
3 auto ans = minmax_element(v0.begin(), v0.end());

11.accumulate函数

1 //**************C++ 标准库中的 accumulate 算法
2 //它接受三个参数
3 // 第一个和第二个参数指定了要累加的范围
4 // 第三个参数是累加的初始值,这里初始值为 0
5 double avg1 = accumulate(v0.begin(), v0.end(), 0) / v0.size();

12.迭代器与解引用操作符*

1 std::string::iterator it = str.begin() + 2;//声明了一个名为 it 的迭代器变量
1 cout << "最小值: " << *iter1 << endl;//***************iter1是一个迭代器,而迭代器本质上是一个指针类型的对象,它指向容器中的一个元素
2 //要获取迭代器所指向的元素的值,就需要使用解引用操作符*

13.取余转换

 1     //****************************************************************************************************************
 2     //**************************************************取余转换******************************************************
 3     while (x > 0) {//只要 x 大于 0,就继续进行转换
 4         
 5         char digit;
 6 
 7         int remainder = x % n;//x 对 n 取余得到当前的最低位数字
 8         
 9         if (remainder < 10) {
10             //如果这个余数小于 10,则将其转换为对应的数字字符
11             digit = remainder + '0';
12         }
13         else {
14             //如果余数大于等于 10,则将其转换为对应的大写字母字符
15             digit = remainder - 10 + 'A';
16         }
17 
18         //###将得到的字符 digit 添加到结果字符串 result 的开头###
19         result = digit + result;
20         
21         
22         //准备处理下一位数字
23         x /= n;
24     }
25     
26     /*
27     例如,将十进制数 10 转换为二进制:
28     第一次循环:10 % 2 = 0,得到最低位数字 0,此时 result = "0",然后 10 /= 2 = 5。
29     第二次循环:5 % 2 = 1,得到下一位数字 1,此时 result = "10",然后 5 /= 2 = 2。
30     第三次循环:2 % 2 = 0,得到数字 0,此时 result = "010",然后 2 /= 2 = 1。
31     第四次循环:1 % 2 = 1,得到数字 1,此时 result = "1010",然后 1 /= 2 = 0,循环结束,返回 "1010"。
32     */
33 
34     //**************************************************取余转换******************************************************
35     //****************************************************************************************************************

14.字符串插入

 1 //#############################################字符串插入#############################################
 2 //1.函数 insert ()
 3 /*//将字符串 "abc" 插入到 "Hello" 的索引为 2 (指向第3个字符)的位置,输出 "Heabcllo"
 4     #include <iostream>
 5     #include <string>
 6 
 7     int main() {
 8         std::string str = "Hello";
 9         str.insert(2, "abc");
10         std::cout << str << std::endl;
11         return 0;
12     }
13 */
14 
15 //2.迭代器插入
16 /*//将字符 'A' 插入到 "Hello" 的索引为 2 的位置,输出 "HeAllo"
17     #include <iostream>
18     #include <string>
19 
20     int main() {
21         std::string str = "Hello";
22         std::string::iterator it = str.begin() + 2;//声明了一个名为 it 的迭代器变量
23         //str.begin() + 2:指向字符串中第三个字符(索引为 2 的位置)的迭代器
24         str.insert(it, 'A');
25         std::cout << str << std::endl;
26         return 0;
27     }
28 
29 */
30 
31 //3.加法插入
32 /*//字符串插入字符串
33 !!!字符和字符串不能直接进行加法运算来插入!!!
34 !!!把字符转换为字符串,然后再进行拼接操作是可以的!!!
35 
36 ###  std::string(1, digit):
37 “1” 这个参数表示新创建的字符串的长度
38 “digit” 这个参数是一个字符,它被用作新创建的长度为 1 的字符串的内容
39 
40 !!!!!在 C++ 中,单个字符可以隐式转换为长度为 1 的字符串!!!!!
41 eg.执行 result = digit + result; 时,首先 digit 被隐式转换为一个只包含该字符的临时字符串对象
42 
43 !!digit + result和 result + digit不同,左拼接和右拼接!!
44 */
45 
46 //#############################################字符串插入#############################################

15.格式化输出

 1 //***********************************************格式化输出***********************************************
 2 //********************************************************************************************************
 3 
 4 //头文件 #include <iomanip>
 5 //右对齐 使用 std::setw()
 6 //左对齐 使用std::left eg. std::cout << std::left << std::setw(5) << num1 << std::endl;
 7 //使用 std::setfill('#') eg. std::cout << std::setfill('0') << std::setw(2) << num << std::endl;
 8 //固定小数点后m位 fixed << setprecision(m) eg. std::cout << std::fixed << std::setprecision(2);
 9 
10 //********************************************************************************************************
11 //***********************************************格式化输出***********************************************

16.生成随机数

1 int generateRandomNumber(int min, int max) {
2     return rand() % (max - min + 1) + min;
3 }

17.随机种子

使用当前时间作为随机数种子

1 srand(static_cast<unsigned int>(time(nullptr)));

<random>库中的随机数引擎和分布*

1 int generateRandomNumber(int min, int max, std::mt19937& rng) {
2     std::uniform_int_distribution<int> dist(min, max);//创建了一个均匀分布的随机数分布对象,范围是从min到max
3     return dist(rng);//使用传入的随机数引擎rng来生成一个符合均匀分布的随机整数并返回
4 }
5 
6 int main() {
7     std::random_device rd; //std::random_device通常是一个可以产生真正随机数的源
8     std::mt19937 rng(rd()); //创建一个std::mt19937类型的随机数引擎对象rng,并使用std::random_device生成的随机数作为种子进行初始化。
9     //std::mt19937是一种伪随机数生成器,具有较高的性能和可重复性。

 

posted @ 2024-10-10 22:14  Sunria  阅读(8)  评论(0编辑  收藏  举报