白乐天

道阻且长,行则将至。

C++

C++基础编程

Hello World

1
2
3
4
5
6
7
8
9
10
#include <iostream> // 引入标准输入输出流库,用于输入和输出操作
using namespace std; // 使用标准命名空间,省略 std:: 前缀

int main() {
// 输出 "Hello, World!" 到控制台
cout << "Hello, World!";

// 返回 0 表示程序正常结束
return 0;
}

基本数据类型

C++继承了C的所有数据类型。

  • bool

    1字节

    值为truefalse,即10

函数

C++继承了C语言中的函数。

在面向对象编程中C++对函数进行了扩展。

流程控制

继承了C。

指针

空指针nullptr

动态内存

new

用于动态分配内存,并返回指向该内存的指针。

1
2
int* p = new int;           // 为一个 int 分配内存
int* arr = new int[10]; // 为一个 int 数组分配内存

delete

用于释放通过 new 分配的内存。

1
2
delete p;         // 释放为单个对象分配的内存
delete[] arr; // 释放为数组分配的内存

std::string类

方法

  • c_str()

    将 C++ 的 std::string 对象转换为 C 风格的字符串(即以空字符 \0 结尾的字符数组)。

函数

指针

const修饰指针

常量指针

指向常量数据的指针

1
const int* ptr;     // 或者等价写法 int const* ptr;

指针可以修改指向(指向其他地址),但不能通过指针修改指向的数据。

示例

1
2
3
4
int a = 10;
const int* ptr = &a;
// *ptr = 20; // 错误:不能修改数据
ptr = nullptr; // 正确:可以修改指针指向

指针常量

指针本身为常量

1
int* const ptr;     // 指针本身不可修改

指针的指向不可修改(必须初始化),但 可以通过指针修改指向的数据。

示例

1
2
3
4
int a = 10;
int* const ptr = &a;
*ptr = 20; // 正确:可以修改数据
// ptr = nullptr; // 错误:不能修改指针指向

结构体

引用

作用:给变量起别名

1
2
3
4
5
6
7
int main(){
int a =10;
int &b = a;
b = 20;
cout << b; // 20
return 0;
}

注意事项:

引用必须初始化,初始化后不能发生改变

引用做函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
void swap(int &a, int &b){
int t = a;
a = b;
b = t;
}

int main(){
int a = 10;
int b = 20;
swap(a,b);
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
}

引用作为函数的返回值

1
2
3
4
5
6
7
8
9
10
11
12
 int& test01(){
static int a =10;
return a;
}

int main(){
int &a = test01();
cout<< a <<endl; // 10
test01() = 20;
cout<< a <<endl; // 20
return 0;
}

引用的本质

引用的本质是指针常量

常量引用

通过const修饰,不能被修改

1
2
3
4
5
6
7
8
9
void showValue(const int &a){
cout<< a << endl;
}

int main(){
int a = 10;
showValue(a); // 10
return 0;
}

面向对象

头文件

简单使用

test.cpp

1
2
3
4
5
6
7
#include "iostream"

using namespace std;

void testcpp(){
cout << "this is a test!" << endl;
}

test.h

1
2
3
4
5
6
7
8
9
// test.h

#ifndef CPPTEST_TEST_H // 如果没有定义 CPPTEST_TEST_H
#define CPPTEST_TEST_H // 定义 CPPTEST_TEST_H,表示该头文件已经被包含

// 头文件的实际内容
void testcpp();

#endif // CPPTEST_TEST_H

main.c

1
2
3
4
5
6
7
8
9
#include <iostream>
#include "test.h"

using namespace std;

int main() {
testcpp(); // 输出:this is a test!
return 0;
}

iostream

cin

cin 使用流操作符(>>),一次可以读取多个变量,输入用空格或回车分隔。

1
2
3
4
5
6
#include <iostream>
using namespace std;
int main(){
int number;
cin >> number;
}

cout

cout 使用流操作符(<<)可以连续输出多个变量。

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main(){
int number;
cin >> number;
cout << number;
cout << "换行" << endl; // endl 表示换行,相当于\n,同时会刷新缓冲区。
}

string

cstring

库函数

strlen

memset

vector

init

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>

int main() {
// 空的 vector
std::vector<int> v1;

// 指定大小的 vector
std::vector<int> v2(10); // 大小为 10,元素默认值为 0

// 指定大小和初始值的 vector
std::vector<int> v3(5, 100); // 大小为 5,元素初始化为 100

// 初始化列表方式
std::vector<int> v4 = {1, 2, 3, 4, 5};

// 复制构造函数
std::vector<int> v5(v4); // v5 复制自 v4

return 0;
}

push_back()

将元素添加到vector的末尾

方法签名

1
2
void push_back(const _Ty& _Val);	// 使用常量引用添加元素
void push_back(_Ty&& _Val); // 使用右值引用添加元素(C++11及以上)

示例

1
2
3
4
5
std::vector<int> v;

v.push_back(10); // 添加 10
v.push_back(20); // 添加 20
v.push_back(30); // 添加 30

pop_back()

删除 vector 中的最后一个元素。

注意,它并不会返回删除的元素,只是移除该元素。

1
void pop_back();

示例

1
2
3
4
5
6
std::vector<int> v;

v.push_back(10); // 添加 10
v.push_back(20); // 添加 20
v.push_back(30); // 添加 30
v.pop_back(); // 删除最后一个元素

at()

访问 vector 中指定索引的元素,并提供边界检查。

1
2
_Ty& at(const size_type _Pos);            // 返回元素的非 const 引用
_Ty& at(const size_type _Pos) const; // 返回元素的 const 引用

front()

访问 vector 中的第一个元素。它返回对第一个元素的引用,允许直接修改该元素。

1
2
_Ty& front(); // 返回第一个元素的非 const 引用
const _Ty& front() const; // 返回第一个元素的 const 引用

back()

用于访问 vector 中的最后一个元素。该方法返回对最后一个元素的引用。

1
2
_Ty& back()         // 返回一个非 const 引用
const _Ty& back() const; // 返回一个 const 引用

示例

1
2
3
4
5
6
7
std::vector<int> v;

v.push_back(10); // 添加 10
v.push_back(20); // 添加 20
v.push_back(30); // 添加 30

std::cout << "Last element: " << v.back() << std::endl; // 输出 30

size()

返回 vector 中当前元素的数量。

1
size_type size() const;

capacity()

返回 vector 当前分配的内存容量(即它可以容纳的元素的最大数量)。

1
size_type capacity() const

resize()

用于调整 vector 的大小。

如果新的大小大于当前大小,vector 会向末尾添加元素;如果新的大小小于当前大小,则会移除末尾的元素。

1
2
void resize(_CRT_GUARDOVERFLOW const size_type _Newsize);
void resize(_CRT_GUARDOVERFLOW const size_type _Newsize, const _Ty& _Val)

reserve()

用于预分配至少 n 个元素的空间。

它不会改变 vector 的大小(即元素的个数),但可以减少因多次添加元素而导致的内存重新分配。

1
void reserve(_CRT_GUARDOVERFLOW size_type _Newcapacity)

clear()

清空 vector 中的所有元素。

empty()

检查 vector 是否为空。

erase()

删除指定位置的元素。

insert()

在指定位置插入元素。