自学内容网 自学内容网

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)!