实验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是一种伪随机数生成器,具有较高的性能和可重复性。