1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。
1.1 find 和 find_if
find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。
find_if(begin, end, predicate):查找第一个满足谓词的元素。
find_end(begin, end, sub_begin, sub_end):查找子序列最后一次出现的位置。
vector
// 查找值为5的元素 auto it = find(nums.begin(), nums.end(), 5); if (it != nums.end()) { cout << "found: " << *it << endl; // 输出:5 }
// 查找第一个大于6的元素 auto it2 = find_if(nums.begin(), nums.end(), [](int x) { return x > 6; }); cout << "first >6: " << *it2 << endl; // 输出:7
// 查找子序列
vector
1.2 count 和 count_if
count(begin, end, value):统计等于 value 的元素个数。
count_if(begin, end, predicate):统计满足谓词(predicate)的元素个数。
std::vector
std::vector
// 比较a和b的前3个元素 bool is_equal = equal(a.begin(), a.end(), b.begin()); cout << "a == b? " << boolalpha << is_equal << endl; // 输出:false
// 查找a和c的第一个不匹配元素 auto mis = mismatch(a.begin(), a.end(), c.begin()); if (mis.first != a.end()) { cout << "mismatch: " << *mis.first << " vs " << *mis.second << endl; // 无输出(a和c前3元素相等) } AI写代码
1.5 all_of, any_of, none_of 检查范围内元素是否全部、存在或没有满足条件的
std::vector
2、修改序列算法 这些算法会修改它们所操作的容器中的元素。
2.1 copy 和 copy_if
copy(begin, end, dest):将 [begin, end) 中的元素复制到 dest 开始的位置。
copy_if(begin, end, dest, predicate):复制满足谓词的元素到 dest。
vector
// 复制所有元素 copy(src.begin(), src.end(), dest.begin()); // dest: [1,2,3,4,5]
// 复制偶数元素到新容器
vector
注意:back_inserter(dest) 会自动调用 push_back,无需提前分配空间。
2.2 transform 对范围内的每个元素应用一个函数,并将结果存储在另一个范围内
vector
// 计算平方(单参数转换) transform(nums.begin(), nums.end(), squares.begin(), [](int x) { return x * x; }); // squares: [1,4,9]
// 两容器元素相加(双参数转换)
vector
2.3 replace、replace_if与 replace_copy
replace(begin, end, old_val, new_val):将所有 old_val 替换为 new_val。
replace_if(begin, end, predicate, new_val):替换满足谓词的元素。
replace_copy(begin, end, dest, old_val, new_val):复制时替换元素(不修改原容器)。
vector
// 替换所有2为20 replace(nums.begin(), nums.end(), 2, 20); // nums: [1,20,3,20,5]
// 替换大于10的元素为0 replace_if(nums.begin(), nums.end(), [](int x) { return x > 10; }, 0); // nums: [1,0,3,0,5]
// 复制时替换3为300(原容器不变)
vector
2.4 remove、remove_if 与 erase
remove(begin, end, value):将等于 value 的元素 “移动” 到容器末尾,返回新的逻辑尾迭代器(不实际删除元素,需配合 erase)。
remove_if(begin, end, predicate):移动满足谓词的元素到末尾。
vector
// 逻辑删除所有2(移动到末尾) auto new_end = remove(nums.begin(), nums.end(), 2); // nums: [1,3,4,2,2]
// 物理删除(真正移除元素) nums.erase(new_end, nums.end()); // nums: [1,3,4]
// 结合lambda删除偶数 nums = {1, 2, 3, 4, 5}; nums.erase(remove_if(nums.begin(), nums.end(), [](int x) { return x % 2 == 0; }), nums.end()); // nums: [1,3,5] AI写代码
2.5 unique 移除范围内连续的重复元素,返回新的逻辑结尾迭代器。通常与erase结合使用。
std::vector
std::vector
std::vector
#include
std::vector
std::vector<std::pair<int, int>> vec = {{1, 2}, {2, 1}, {1, 1}, {2, 2}}; std::stable_sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.first < b.first; // 按first排序,保持相等元素的相对顺序 });
std::vector
3.2 nth_element 重新排列范围,使得指定位置的元素等于排序后的元素,并且左边的元素都不大于它,右边的元素都不小于它
std::vector
binary_search(begin, end, value):判断 value 是否存在(返回 bool)。
lower_bound(begin, end, value):返回第一个不小于 value 的元素迭代器。
upper_bound(begin, end, value):返回第一个大于 value 的元素迭代器。
vector
// 判断3是否存在 bool exists = binary_search(sorted.begin(), sorted.end(), 3); // true
// 查找第一个>=3的元素 auto lb = lower_bound(sorted.begin(), sorted.end(), 3); cout << "lower_bound index: " << lb - sorted.begin() << endl; // 输出:1
// 查找第一个>3的元素 auto ub = upper_bound(sorted.begin(), sorted.end(), 3); cout << "upper_bound index: " << ub - sorted.begin() << endl; // 输出:3 AI写代码
3.4 merge 合并两个已排序的范围到新容器(保持排序)
vector
// 合并a和b(均需已排序) merge(a.begin(), a.end(), b.begin(), b.end(), merged.begin()); // merged: [1,2,3,4,5,6] AI写代码 4、堆算法 STL提供了将范围作为堆来操作的算法,包括make_heap, push_heap, pop_heap, sort_heap等。
std::vector
vec.push_back(6); std::push_heap(vec.begin(), vec.end()); // 将新元素加入堆,vec变为{6, 4, 5, 2, 1, 3}
std::pop_heap(vec.begin(), vec.end()); // 将最大元素移到末尾,vec变为{5, 4, 3, 2, 1, 6} int max_val = vec.back(); // 获取最大元素6 vec.pop_back(); // 移除最大元素
std::sort_heap(vec.begin(), vec.end()); // 将堆排序为升序序列,vec变为{1, 2, 3, 4, 5} AI写代码
5、最小/最大值算法 5.1 min 和 max 返回两个值或初始化列表中的最小/最大值
int a = 5, b = 3; int min_val = std::min(a, b); // 3 int max_val = std::max(a, b); // 5
auto min_of_list = std::min({4, 2, 8, 5, 1}); // 1 auto max_of_list = std::max({4, 2, 8, 5, 1}); // 8 AI写代码 5.2 min_element 和 max_element 返回范围内的最小/最大元素的迭代器
std::vector
std::vector
#include
std::vector
std::vector
std::vector
std::vector
std::vector
std::vector
std::vector
std::vector
std::vector
// 并集 std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(result)); // result为{1, 2, 3, 4, 5, 6, 7}
// 交集 result.clear(); std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(result)); // result为{3, 4, 5}
// 差集 (v1 - v2) result.clear(); std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(result)); // result为{1, 2}
// 对称差集 (v1 ∪ v2 - v1 ∩ v2) result.clear(); std::set_symmetric_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(result)); // result为{1, 2, 6, 7} AI写代码
8、常见问题 sort 与 stable_sort 的区别?
sort 采用快速排序(实际是 introsort 算法),不稳定(相等元素的相对位置可能改变),平均时间复杂度 O (n log n)。 stable_sort 采用归并排序,稳定(相等元素相对位置不变),时间复杂度 O (n log n),但空间开销略大。 为什么 remove 算法需要配合 erase 使用? remove 算法的原理是 “覆盖” 要删除的元素,将保留的元素移到前面,返回新的逻辑尾迭代器,但不修改容器的实际大小。erase 则通过迭代器范围真正删除元素,修改容器大小。因此需结合使用:container.erase(remove(...), container.end())。
哪些算法需要容器是已排序的? 二分查找系列(binary_search、lower_bound、upper_bound)、集合算法(set_intersection、set_union 等)、merge 等,这些算法依赖有序性实现高效操作(如二分查找 O (log n))。 ———————————————— 版权声明:本文为CSDN博主「Hgfdsaqwr」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Hgfdsaqwr/article/details/156809238 https://infogram.com/9862pdf-1hnp27eqdjm7n4g https://infogram.com/9862pdf-1h0r6rzwyqpjl4e https://infogram.com/9862pdf-1h0n25opqjool4p https://infogram.com/9862pdf-1hxj48mqgjmn52v https://infogram.com/9862pdf-1h1749wqzjwjl2z https://infogram.com/9862pdf-1h9j6q759q7e54g https://infogram.com/9862pdf-1h984wv15gved2p https://infogram.com/9862pdf-1h0n25opqjkkl4p https://infogram.com/9862pdf-1h9j6q759q0pv4g https://infogram.com/9862pdf-1hnp27eqdjkxy4g

