C++中常用的算法库函数大总结

字符串

1. to_string()

//int型 double型都适用
int num = 42;
string strNum = to_string(num);

2. stoi, stol, stof等

3.1 stoi

功能: 将字符串转换为 int 类型。
原型:
int stoi(const std::string& str, std::size_t* idx = nullptr, int base = 10);
参数:
str: 要转换的字符串。
idx: 指向未转换字符的索引(可选)。
base: 指定数字的进制(可选,默认为 10)。

3.2 stol

功能: 将字符串转换为 long 类型。
原型:
long stol(const std::string& str, std::size_t* idx = nullptr, int base = 10);

3.3 stoll

功能: 将字符串转换为 long long 类型。
原型:
long long stoll(const std::string& str, std::size_t* idx = nullptr, int base = 10);

3.4 stof

功能: 将字符串转换为 float 类型。
原型:
float stof(const std::string& str, std::size_t* idx = nullptr);

3.5 stod

功能: 将字符串转换为 double 类型。
原型:
double stod(const std::string& str, std::size_t* idx = nullptr);

3.6 stold

功能: 将字符串转换为 long double 类型。
原型:
long double stold(const std::string& str, std::size_t* idx = nullptr);

int main() {
    string strInt = "12345";
    string strFloat = "123.45";
    string strLong = "1234567890123456789";

    try {
        int intVal = stoi(strInt);
        float floatVal = stof(strFloat);
        long longVal = stol(strLong);
        double doubleVal = stod("3.14159");

        cout << "Integer: " << intVal << endl;
        cout << "Float: " << floatVal << endl;
        cout << "Long: " << longVal << endl;
        cout << "Double: " << doubleVal << endl;
    } catch (const invalid_argument& e) {
        cerr << "Invalid argument: " << e.what() << endl;
    } catch (const out_of_range& e) {
        cerr << "Out of range: " << e.what() << endl;
    }

    return 0;
}

容器操作(STL基本都行)

1. back() 和 front()

v.back(): 获取容器的最后一个元素。

v.front(): 获取容器的第一个元素

2. rbegin() 和 rend()

作用:返回指向最后一个元素和尾后元素的逆向迭代器。

用法auto rit = myset.rbegin() 获取最后一个元素的逆向迭代器。

3.emplace() 和 emplace_back()

emplaceemplace_back 是 C++ 标准库中的两个强大函数,它们都用于在可容纳对象的容器中直接构造对象,避免不必要的复制或移动。

emplace_back 适用于vector,deque,list等序列容器

emplace适用于几乎所有容器: vector map queue priority_queue set

vector<int> v;
v.emplace(v.begin(),1);
v.emplace_back(1);

//优先队列 默认大根堆  greater<>小根堆
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> pq;
pq.push(make_pair(0,k));
pq.emplace(0, k);

priority_queue<tuple<int, int, int>,vector<tuple<int,int,int>>,greater<>> pq;
pq.emplace(0, s, k);
class MyClass {
public:
    MyClass(int x) : val(x) {
        cout << "MyClass constructed with value: " << val << endl;
    }
private:
    int val;
};

int main() {
    map<int, MyClass> myMap;
    myMap.emplace(1, 10); // 在 map 中插入一个键值对,其中值是 MyClass 对象
    return 0;
}

4. insert()

string s = "abc";
s.insert(0,2,'b');//在0位置插入2个字符a => bbabc

s.insert(3,1,'a');//在末尾插入1个字符a => abca
//或者
s.insert(s.size(),1,'a');

5. fill()

用特定值填充容器

vector<int> vec = {1, 2, 3, 4, 5};

// 填充 vector 的前 3 个元素为 0
fill(vec.begin(), vec.begin() + 3, 0);

//或者
ranges::fill(vec, 0);

6. count()

计算特定值在容器中出现的次数

vector<int> vec = {1, 2, 3, 2, 4, 2, 5};

// 计算值 2 在 vec 中出现的次数
int count = count(vec.begin(), vec.end(), 2);

//或者
ranges::count(vec, 2);

7. copy()

复制元素

copy(newstr, newstr + size, temp);

  • 第一个参数是源的起始位置,即要复制元素的起始地址。
  • 第二个参数是源的结束位置,即要复制元素的结束地址的下一个位置。
  • 第三个参数是目标的起始位置,即复制后元要存放的位置。

示例:

vector<int> a = {1,2,3};
vector<int> b(20,0);
copy(a.begin(),a.end(),b.begin());

算法库函数

1. sort()

sort(v.begin(),v.end(),[](const auto& a,const auto& b){
     return a[1] < b[1]; //从小到大排序
});

自定义比较函数

bool customCompare(const int& a, const int& b) {
    // 比较规则:按照绝对值从大到小排序
    return abs(a) > abs(b);
}

int main() {
    vector<int> nums = {3, -1, 4, -2, 5, -9, 2, 6};
    
    // 使用自定义比较函数进行排序
    sort(nums.begin(), nums.end(), customCompare);
    
    // 使用 Lambda 表达式进行排序(按照绝对值从大到小排序)
    sort(nums.begin(), nums.end(), [](const int& a, const int& b) {
        return abs(a) > abs(b);
    });
    
    return 0;
}

2. reverse()

反转容器中的元素顺序

reverse(s.begin(), s.begin() + i )

常用于 数组 vector string deque

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};

    // 打印原始向量
    cout << "Original vector: ";
    for (int n : vec) {
        std::cout << n << " ";
    }
    cout << std::endl;

    // 反转向量
    reverse(vec.begin(), vec.end());

    // 打印反转后的向量
    cout << "Reversed vector: ";
    for (int n : vec) {
        std::cout << n << " ";
    }
    cout << std::endl;

    return 0;
}

3. find() , find_if() 和 find_if_not()

find(): 查找特定值

find_if(): 查找符合特定条件的第一个元素

find_if_not(): 查找不符合特定条件的第一个元素

vector<int> v = {1, 2, 3, 4, 5};

//find_if 在范围内查找第一个偶数
auto it = find_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });

//find_if_not 在范围内查找第一个不是偶数
auto it = find_if_not(v.begin(), v.end(), [](int x) { return x % 2 == 0; });

if (it != v.end()) {
	cout << "Found the first even number: " << *it << endl;
} else {
	cout << "No even number found!" << endl;
}

//find
vector<int> v = { 1,2,3 };
int it = find(v.begin(),v.end(),2)-v.begin();
cout << v[it] << endl;

//string find
string s1 = "abc";
int it = s1.find("bc");

4. replace()

替换容器中符合条件的元素

str.replace(pos, len, str)

string str("The quick brown fox jumps over the lazy dog.");

// brown替换为fox
str.replace(10, 5, "red"); 

//将The替换为2个A
str.replace(str.begin(), str.begin() + 3, 2, 'A');

5. for_each()

对容器中的每个元素执行函数

vector<int> v = { 1, 2, 3, 4, 5 };
//每个数进行平方
for_each(v.begin(), v.end(), [](int& a) {
    a *= a;
    });
    
//打印每个数
for_each(v.begin(), v.end(), [](int a) {
    cout << a << " ";
    });

6. transform

用于对指定范围内的元素进行操作并将结果存储到另一个范围。

示例 1:使用单一操作(输入范围到输出范围)

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};
    vector<int> squared(vec.size());

    // 使用 transform 将 vec 中的每个元素平方并输出到 squared
    transform(vec.begin(), vec.end(), squared.begin(), [](int x) { return x * x; });

    return 0;
}

示例 2:两个输入范围到一个输出范围

int main() {
    vector<int> vec1 = {1, 2, 3};
    vector<int> vec2 = {4, 5, 6};
    vector<int> sum(vec1.size());

    // 使用 transform 将 vec1 和 vec2 中的元素相加并输出到 sum
    transform(vec1.begin(), vec1.end(), vec2.begin(), sum.begin(), [](int x, int y) { return x + y; });
    return 0;
}

7. equal()

比较两个范围的元素是否相等

int main() {
    int arr1[] = {1, 2, 3, 4, 5};
    int arr2[] = {1, 2, 3, 4, 5};

    bool result = equal(begin(arr1), end(arr1), begin(arr2));
    if (result) {
        cout << "两数组相等" << std::endl;
    } else {
        cout << "两数组不相等" << std::endl;
    }

    return 0;
}
bool custom_compare(int a, int b) {
    return a % 2 == b % 2; // 只比较奇偶性
}

int main() {
    vector<int> vec1 = {1, 2, 3, 4, 5};
    vector<int> vec2 = {1, 3, 5, 7, 9};

    if (equal(vec1.begin(), vec1.end(), vec2.begin(), custom_compare)) {
        cout << "两容器有相同的奇偶性" << endl;
    } else {
        cout << "两容器没有相同的奇偶性" << endl;
    }

    return 0;
}

8. accumulate()

对范围内的元素进行累加

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    int sum = accumulate(numbers.begin(), numbers.end(), 0);//0: init
    cout << "累加和为: " << sum << std::endl;

   
    int p=1e9+7;
    return accumulate(dp.begin()+low,dp.begin()+high+1,0,[p](int sum,int cur){
            return sum = (sum + cur) % p;
        });
    return 0;
}   

9. max_element , min_element, minmax_element和minmax

与max不同,max返回最大值的引用,而max_element返回的是地址

max也可以同时比较多个元素

bool customCompare(const int& a, const int& b) {
	return abs(a) < abs(b);//绝对值从小到大,返回最后则是最大
}

int main() {
    int arr[] = {5, 8, 3, 9, 2};
    int n = sizeof(arr) / sizeof(arr[0]);

	//max也可以比较多个
	int max_ = max({5,8,3,9,2});
    
    // 使用 max_element 求取数组中的最大值
    int max_val = *max_element(arr, arr + n);
    
    //自定义比较函数
	auto max_it = max_element(nums.begin(), nums.end(), customCompare);
	cout << "最大值为: " << *max_it << endl;
	
    //min_element同理
    
    //minmax_element
    vector<int> b = {1,3,4,2,6};
    auto res = minmax_element(b.begin(),b.end());
	cout << *res.first << " " << *res.second;
    
    //minmax比较两个值
    auto ress = minmax(b[0],b[3]);
	cout << ress.first << " " << ress.second;
    return 0;
}

10. nth_element()

对元素进行部分排序,找到第 N 个元素的位置

vector<int> v{ 5, 6, 4, 3, 2, 6, 7, 9, 3 };

nth_element(v.begin(), v.begin() + v.size() / 2, v.end());
cout << "中位数是 " << v[v.size() / 2] << '\n';

nth_element(v.begin(), v.begin() + 1, v.end(), greater<int>());
cout << "第二大的数为" << v[1] << '\n';

11. partial_sum()

计算部分前缀和

int main() {
    vector<int> input = {1, 2, 3, 4, 5};
    vector<int> output(input.size());

    partial_sum(input.begin(), input.end(), output.begin());

    // 输出结果
    for (const auto& num : output) {
        std::cout << num << " ";
    }
    cout << std::endl;
	//output
    //1 3 6 10 15
    return 0;
}

12. iota()

用连续的递增值填充范围

int main() {
    vector<int> vec(10); // 创建一个大小为10的整数向量

    // 使用 std::iota 填充 vec,初始值从1开始
    iota(vec.begin(), vec.end(), 1);//1 2 3 4 5 6 7 8 9 10

    return 0;
}

13. upper_bound() 和 lower_bound()

upper_bound(): 查找第一个大于特定值的元素位置

lower_bound(): 查找第一个不小于特定值的元素位置

注意: 返回的是地址指针

int main() {
    vector<int> vec = {1, 2, 4, 5, 6, 8, 10}; // 已排序的向量
    int value = 5;

    // 查找第一个不小于 5 的元素
    auto it = lower_bound(vec.begin(), vec.end(), value);
    //upper_bound同理

    // 输出结果
    if (it != vec.end()) {
        cout << "第一个不小于" << value << "的是" << *it << "位置为:" << (it - vec.begin()) << endl;
    } else {
        cout << "所以的数都小于" << value << endl;
    }
    return 0;
}

pair结构体和元组

1. pair<>

//定义
pair<int, string> myPair = make_pair(10, "hello");

//pair在vector中的使用
vector<pair<int, string>> vec;
vec.push_back(make_pair(1, "apple"));

//pair在map中的使用
map<int, pair<int, string>> myMap;
myMap[1] = make_pair(10, "banana");

2. tuple<>

tuple是类似于pair的模板,不同之处在于pair是两个成员,而tuple可以任意数量的成员。

//定义
tuple<int, int, int> threeI{1,2,3};

//获取
auto book = get<0>(threeI);  //返回threeI的第一个成员
auto price = get<1>(threeI); //返回threeI的第二个成员
auto haha = get<2>(threeI);  //返回threeI的第三个成员

结束语

以上内容总结均来自C++帮助文档,若有误,欢迎留言指正!!!
C&C帮助文档

整理不易,请各位看官点赞,收藏加关注~~~

  • 43
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值