C++ STL填充算法

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <list>
#include <set>
#include <cstdlib>
#include <functional>
using namespace std;

template<typename T>
void printVector(vector<T> v)
{
 vector<T>::iterator it;
 for(it=v.begin();it!=v.end();++it) //使用迭代器输出
  cout<<*it<<" ";
 cout<<endl;
}


int main()
{
 vector<double> v(4);
 fill(v.begin(),v.end(),888);
 printVector(v);//使用迭代器输出
//  for(int i=0;i<v.size();i++)
//   cout<<v[i]<<" ";

 //////////////////////////////////////////////////////////////////////////
 vector<double> v1(4,128);
 fill_n(back_inserter(v1),4,137); //4表示在后面插入几个

 printVector(v1);//使用迭代器输出

 //////////////generate()////////////////////////////////////////////////////////////
 vector<int> v2(10);
 generate(v2.begin(),v2.end(),rand);
 printVector(v2);

 ///////////remove()///////////////////////////////////////////////////////////////
 const int Arr[9]={1,2,3,4,5,6,7,5,4};
 vector<int> Varr(Arr,Arr+9);
 printVector(Varr);

 vector<int>::iterator new_end=remove(Varr.begin(),Varr.end(),1);
 for(new_end=Varr.begin();new_end!=Varr.end();new_end++)
 {
  cout<<*new_end<<" ";
 }
 cout<<endl;

 //Varr.erase(new_end,Varr.end());
 printVector(Varr);
 cout<<endl;

 /////unique()/////////////////////////////////////////////////////////////////////
 int AA[8]={7,7,1,4,6,6,6,3};

 int* new_end1=unique(AA,AA+8,equal_to<int>());
 copy(AA,new_end1,ostream_iterator<int>(cout," "));
 cout<<endl;


 return 0;
}

<think>好的,用户让我介绍一下C++ STL常用算法详解。首先,我需要确定用户的需求是什么。他们可能正在学习C++,或者在实际编程中遇到了需要用到STL算法的问题。STL算法有很多,用户可能希望了解最常用的部分,以及具体的用法和例子。 接下来,我应该考虑如何组织内容。通常,分类介绍会比较清晰,比如分为非修改序列操作、修改序列操作、排序和查找、数值操作等。这样用户可以根据需求快速找到需要的算法。 然后,每个算法需要给出功能描述、参数说明和示例代码。示例代码很重要,能帮助用户理解如何使用这些算法。需要注意的是,示例代码应该简洁,并且覆盖常见的使用场景。 可能用户对某些高级用法不太熟悉,比如lambda表达式在算法中的应用,或者自定义谓词的使用。因此,在例子中加入这些元素会更有帮助。比如在sort或transform中使用lambda,可以展示更灵活的应用方式。 还要注意提到C++版本的变化,比如C++11引入的lambda和范围for循环,以及C++17的并行算法特性。这有助于用户了解不同版本中的支持情况,避免兼容性问题。 用户可能容易混淆某些算法,比如remove和erase的区别,需要特别说明。remove只是移动元素,返回新的逻辑结尾,而erase才是真正删除元素。这种常见误区需要强调,避免用户犯错。 另外,数值操作部分如accumulate和inner_product可能在实际项目中应用较多,比如统计和矩阵运算。给出具体的例子能帮助用户联想到实际应用场景。 最后,总结部分可以强调STL算法的优势,比如高效、类型安全和可扩展性,鼓励用户多加练习。同时,提醒他们查阅官方文档以获取更详细的信息。 检查是否有遗漏的重要算法,比如all_of/any_of/none_of这些C++11新增的算法,以及copy和replace系列函数。确保覆盖最常用的部分,同时不过于冗长。 现在需要将这些思考整理成一个结构清晰、内容详实的回答,使用用户友好的语言,避免过于技术化的术语,同时保持准确性。确保代码示例正确,并且解释到位,让不同水平的读者都能有所收获。</think>C++ STL(Standard Template Library)提供了丰富的算法库,能够高效处理容器数据。以下是对常用算法的分类详解及示例: ### 一、非修改序列操作 1. **遍历操作** ```cpp for_each(v.begin(), v.end(), [](int x){ cout << x * 2 << " "; // 所有元素乘2输出 }); ``` 2. **条件判断** ```cpp // 检查是否全为偶数 bool allEven = all_of(v.begin(), v.end(), [](int x){ return x % 2 == 0; }); ``` 3. **元素查找** ```cpp auto it = find(v.begin(), v.end(), 42); // 查找第一个42 auto it2 = find_if(v.begin(), v.end(), [](int x){ return x > 100; }); // 找第一个>100的元素 ``` ### 二、修改序列操作 1. **元素填充** ```cpp fill(v.begin(), v.begin()+5, 0); // 前5个元素填0 ``` 2. **元素复制** ```cpp vector<int> dest(10); copy(v.begin(), v.end(), dest.begin()); // 支持不同类型容器复制 ``` 3. **元素替换** ```cpp replace(v.begin(), v.end(), 5, 10); // 所有5替换为10 ``` ### 三、排序与查找 1. **快速排序** ```cpp sort(v.begin(), v.end(), [](int a, int b){ return a > b; // 降序排列 }); ``` 2. **二分查找** ```cpp bool found = binary_search(v.begin(), v.end(), 42); // 需先排序 ``` 3. **合并有序序列** ```cpp vector<int> v1 = {1,3,5}, v2 = {2,4,6}, result(6); merge(v1.begin(), v1.end(), v2.begin(), v2.end(), result.begin()); ``` ### 四、数值操作 1. **累加计算** ```cpp int sum = accumulate(v.begin(), v.end(), 0, [](int a, int b){ return a + (b % 2 == 0 ? b : 0); // 仅累加偶数 }); ``` 2. **内积计算** ```cpp vector<int> a{1,2}, b{3,4}; int dot = inner_product(a.begin(), a.end(), b.begin(), 0); // 1*3 + 2*4=11 ``` ### 五、特殊操作 1. **元素移除** ```cpp auto new_end = remove(v.begin(), v.end(), 0); // 逻辑删除0 v.erase(new_end, v.end()); // 物理删除 ``` 2. **序列反转** ```cpp reverse(str.begin(), str.end()); // 反转字符串 ``` 3. **去重操作** ```cpp sort(v.begin(), v.end()); auto last = unique(v.begin(), v.end()); // 需先排序 v.erase(last, v.end()); ``` ### 六、高级用法 1. **谓词组合**(C++11) ```cpp auto isEvenAndPositive = [](int x){ return x > 0 && x % 2 == 0; }; count_if(v.begin(), v.end(), isEvenAndPositive); ``` 2. **并行处理**(C++17) ```cpp vector<int> bigData(1'000'000); sort(execution::par, bigData.begin(), bigData.end()); // 并行排序 ``` ### 使用技巧 1. 配合迭代器适配器: ```cpp copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v)); ``` 2. 类型推导优化: ```cpp auto it = min_element(begin(v), end(v)); // 自动推导迭代器类型 ``` 3. 视图处理(C++20 Ranges): ```cpp auto even = v | views::filter([](int x){ return x%2 == 0; }); ``` 注意要点: - 修改类算法通常返回迭代器,需配合erase使用 - 涉及比较的算法可自定义比较函数 - 算法复杂度从O(n)到O(n log n)不等,需根据数据量选择 - 使用前确保容器已正确初始化 - 注意迭代器失效问题 建议结合具体需求选择算法,例如需要稳定性时选择stable_sort,大数据量时考虑partial_sort。熟练掌握STL算法可提升代码效率和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值