C++知识点
1.C++
【1】reverse 函数
reverse 函数可以用于多种容器,如 std::vector、std::string、std::array 等。reverse 函数定义在 <algorithm> 头文件中。
函数原型
template <class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last);
first:指向序列开始的迭代器。
last:指向序列结束的迭代器。
作用
reverse 函数将 [first, last) 范围内的元素顺序反转。这意味着序列的第一个元素将变成最后一个元素,第二个元素将变成倒数第二个元素,依此类推。
示例
示例 1:反转字符串
std::string text = "Hello, World!";
std::reverse(text.begin(), text.end()); // 反转字符串
示例 2:反转向量
std::vector<int> vec = {1, 2, 3, 4, 5};
std::reverse(vec.begin(), vec.end()); // 反转向量
实际应用 反转部分序列
std::vector<int> vec = {1, 2, 3, 4, 5};
std::reverse(vec.begin(), vec.begin() + 3); // 反转前三个元素
std::vector<int> vec = {1, 2, 3, 4, 5};
std::reverse(vec.end()-3, vec.end()); // 反转后三个元素
#include <iostream>
#include <string>
#include<algorithm>
using namespace std;
int main() {
string text = "World";
string word = "Hello";
cout<<text<<endl<<word<<endl;
reverse(text.end()-3,text.end() );
reverse(word.begin(),word.begin() +3 );
cout<<text<<endl<<word<<endl;
return 0;
}
//输出
World
Hello
Wodlr
leHlo
【2】计算字符串长度strlen()
用法 int len=strlen(str); len为字符串str的长度,不包含'\0'。
【3】快排函数sort,它位于<algorithm>头文件中
std::sort(arr, arr + n, std::greater<int>()); // 对数组进行降序排序
std::sort(arr, arr + n); // 对数组进行升序排序
std::sort(arr, arr + n, compare); 第一个参数是首元素迭代器,第二个参数是最后一个元素的下一个元素的迭代器。比较函数的定义bool compare ( const void &a ,const void &b);
示例
bool compare(int a, int b) {
return a > b; // 降序排序
}
std::sort(arr, arr + n, compare);
【4】#include<bits/stdc++.h>
这行代码包含了 C++ 标准库中的几乎所有头文件。虽然这不是最佳实践(因为会导致编译时间增加),但在竞赛编程中经常使用,因为它方便快捷。
【5】using namespace std;
这行代码允许我们使用标准库中的所有名称(如 vector、cout 等)而不需要前缀 std::。虽然这在小规模代码中很方便,但在大型项目中可能会导致命名冲突。
【6】using i64 = long long;
using i128 = __int128;
这两行代码使用了 C++11 引入的类型别名语法 using。i64 是 long long 类型的别名,long long 是一种整数类型,至少占用 64 位,可以表示较大的整数。i128 是 __int128 类型的别名,__int128 是一种扩展的整数类型,占用 128 位,用于表示更大的整数。不过,__int128 不是标准 C++ 类型,它在一些编译器(如 GCC)中作为扩展提供。
using i64 = long long; 定义了一个新的类型 i64,它是一个 64 位的整数类型。
using i128 = __int128; 定义了一个新的类型 i128,它是一个 128 位的整数类型。这个类型在处理非常大的整数时很有用。
示例
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
using i128 = __int128;
【7】auto 关键字允许编译器自动推导变量 的类型。
示例
for (auto k : a)
auto:这是一个类型推导关键字,告诉编译器自动推导 k 的类型。k 的类型将与容器 a 中的元素类型相同。
k:这是循环变量,用于存储容器 a 中的每个元素的副本。(元素副本: ◦ 在每次迭代中,k 都会获取容器 a 中当前元素的副本。这意味着对 k 的修改不会影响原始容器中的元素。)
a:这是要遍历的容器,可以是 vector、array、list、set、map 等任何支持迭代的容器。
示例引用遍历
for (auto& k : a) {
k *= 2; // 修改容器中的元素
}
这样,k 将是一个引用,直接指向容器 a 中的元素,对 k 的修改将反映在原始容器中。
【8】
#define sz(x) (int)x.size()
#define all(v) v.begin() , v.end()
这两行代码使用了宏定义。sz(x) 定义了一个宏,用于获取容器 x 的大小,并将其转换为 int 类型。all(v) 定义了一个宏,用于获取容器 v 的起始迭代器和结束迭代器,常用于范围相关的操作,如 std::sort(all(v)) 可以对整个容器 v 进行排序。
【9】
#define ps(y) cout<<fixed<<setprecision(y)
这行代码定义了一个宏 ps(y),用于设置输出的精度。fixed 是一个操纵符,用于设置浮点数的输出格式为固定小数点表示法。setprecision(y) 用于设置输出的精度为 y 位小数。这个宏常用于输出浮点数时控制小数位数。
【10】empty() 函数
empty() 是 C++ 标准库中容器类(如 std::vector、std::stack、std::queue 等)的成员函数,用于检查容器是否为空。它的返回值是一个布尔值(bool),具体如下:
• 如果容器为空(即容器中没有元素),empty() 返回 true。
• 如果容器不为空(即容器中至少有一个元素),empty() 返回 false。
示例
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
// 检查栈是否为空
if (s.empty()) {
std::cout << "栈为空" << std::endl;
} else {
std::cout << "栈不为空" << std::endl;
}
// 向栈中添加一个元素
s.push(10);
// 再次检查栈是否为空
if (s.empty()) {
std::cout << "栈为空" << std::endl;
} else {
std::cout << "栈不为空" << std::endl;
}
return 0;
}
输出
栈为空
栈不为空
【11】std::string 类的 find 函数
在C++中,std::string 类的 find 函数用于在字符串中查找指定的子串。如果找到了子串,函数返回子串第一次出现的位置的索引;如果没有找到,函数返回一个特殊的常量 std::string::npos,这个常量通常用于表示“未找到”的情况。
函数原型
cpp size_t find(const string& str, size_t pos = 0) const;
• str:要查找的子串。
• pos:可选参数,指定开始查找的起始位置,默认为0,表示从字符串的开始位置查找。
返回值
• 如果找到了子串,返回子串第一次出现的位置的索引(即字串首元素所在位置)。
• 如果没有找到子串,返回 std::string::npos。
示例
示例:一个参数
string a;
ize_t position = str.find(a);
示例:两个参数
size_t position = str.find(word, 5); // 从位置 5 开始查找
示例
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string as={"hello world"};
string ab={"world"};
size_t position = as.find(ab);
cout<<position<<endl;
return 0;
}
6
--------------------------------
Process exited after 0.3732 seconds with return value 0
请按任意键继续. . .
实际应用 查找所有出现的位置
#include <iostream>
#include <string>
int main() {
std::string text = "Hello, World! Hello, C++!";
std::string word = "Hello";
size_t position = 0;
while ((position = text.find(word, position)) != std::string::npos) {
std::cout << "Found '" << word << "' at position: " << position << std::endl;
position += word.length(); // 移动查找的起始位置,避免重复查找
}
return 0;
}
//输出
Found 'Hello' at position: 0
Found 'Hello' at position: 14
【12】size_t——C++ 中的一个无符号整数类型
size_t 是 C++ 中的一个无符号整数类型,通常用于表示大小、长度、索引等非负整数值。它在 <cstddef> 头文件中定义,但在大多数标准库头文件中都可以直接使用,因此在包含 <string>、<vector> 等头文件时,通常不需要额外包含 <cstddef>。
主要用途
1. 表示大小和长度:size_t 用于表示对象的大小,如数组的长度、字符串的长度、容器的大小等。
2. 索引:size_t 用于表示索引,因为它可以表示从 0 到最大可能值的范围,适合用于循环和数组索引。
3. 函数返回值:许多标准库函数返回 size_t 类型的值,如 std::string::size()、std::vector::size()、std::string::find() 等。
特点
• 无符号整数:size_t 是一个无符号整数类型,这意味着它只能表示非负整数。
• 平台相关:size_t 的大小是平台相关的,通常与指针的大小相同。在 32 位系统上,size_t 通常是 32 位;在 64 位系统上,size_t 通常是 64 位。
• 范围:size_t 的范围是从 0 到 SIZE_MAX,SIZE_MAX 是 <cstddef> 中定义的一个常量,表示 size_t 类型能表示的最大值。
示例
示例 1:表示字符串长度
std::string text = "Hello, World!";
size_t length = text.size(); // 获取字符串的长度
std::cout << "Length of the string: " << length << std::endl;
输出
Length of the string: 13
示例 2:查找子串位置
#include <iostream>
#include <string>
int main() {
std::string text = "Hello, World!";
std::string word = "World";
size_t position = text.find(word); // 查找子串的位置
if (position != std::string::npos) {
std::cout << "Found '" << word << "' at position: " << position << std::endl;
} else {
std::cout << "The word '" << word << "' was not found in the text." << std::endl;
}
return 0;
}
//输出
Found 'World' at position: 7
示例 3:遍历容器
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
size_t size = vec.size(); // 获取容器的大小
for (size_t i = 0; i < size; ++i) {
std::cout << vec[i] << " ";
}
std::cout << std::endl;
return 0;
}
//输出
1 2 3 4 5
【13】范围基 for 循环(Range-based for loop)
C++11 引入的范围基 for 循环(Range-based for loop),也称为基于范围的 for 循环。这种循环结构用于遍历容器中的每个元素,无需手动管理迭代器。它提供了一种简洁且易于理解的方式来遍历容器中的所有元素。
语法
for ( element: range) {
// 循环体
}
range:要遍历的容器或数组。
element:在每次迭代中,element 被赋值为 range 中的当前元素。
优点
• 简洁:范围基 for 循环提供了一种简洁的方式来遍历容器中的所有元素,无需手动管理迭代器。
• 易读:代码更易于理解和维护,特别是对于简单的遍历操作。
• 通用:可以用于任何支持迭代器的容器,如 std::vector、std::list、std::array、std::string 等。
缺点
范围基 for 循环本身不直接支持反向遍历
适用场景:适用于简单地遍历整个容器或数组中的每个元素,特别是当不需要手动管理迭代器或计数器时。
示例
std::vector<int> vec = {1, 2, 3, 4, 5};
for (int num : vec) {
std::cout << num << " ";
}
修改元素:如果需要在遍历过程中修改容器中的元素,可以使用引用类型。例如:
for (int& num : vec) {
num *= 2; // 修改元素
}
常量引用:如果容器中的元素不应被修改,可以使用常量引用。例如:
for (const int& num : vec) {
std::cout << num << " "; // 只读访问
}
总结:范围基 for 循环是 C++11 引入的一种方便的遍历容器中元素的方法,提供了一种简洁、易读且通用的语法。它适用于多种容器和数据结构,可以显著简化代码。
【14】std::string::npos
std::string::npos是一个表示最大可能的 size_t 值的常量,通常用于表示“未找到”或“无效位置”。
• 用途:在字符串查找操作中,如果未找到指定的子串,返回 std::string::npos。也可以作为默认参数,表示“直到字符串末尾”或“从字符串开始”。
• 示例:在 std::string::find 和 std::string::rfind 等函数中,返回 std::string::npos 表示未找到子串。
2.题目中的相关概念
【1】非递减顺序排列是指:数列递减,但不是单调递减,中间可以有重复。
【2】非递增顺序排列是指:数列递增,但不是单调递增,中间可以有重复。
1,2,3,4,5,6,7:递增排列,
9,8,7,6,5,3,2,1:递减排列。
1,2,3,3,5,5,8,8:非递减排列,
9,8,7,7,6,5,5,4,1 : 非递增排列。
原文地址:https://blog.csdn.net/2401_88591507/article/details/145017447
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!