C++核心技术:STL的查漏补缺

5 分钟阅读 612 字 + 652 词
map的不同插入方式:
mp.insert({key,value});
mp.emplace(key,value);
mp.try_emplace(key,value的构造参数) ;  //性能最好
mp.insert_or_assign(key,value);
mp[key] = value;
partition方法:
auto it = partition(c.begin(),c.end(),[] ( int x){return x< 100;});//将满足第三个参数条件的元素放到容器的前半部分
sort(c.begin(), it);
容器输出
copy(c.begin(),c.end(), ostream_iterator<typename C::value_type>(cout," "));//通过typename C::value_type来获得容器的元素类型
//或者在已知道类型时使用 <类型>
容器插入迭代器
deque<int> d;
copy(c.begin(),c.end(), back_inserter(d));
容器复制
vector<int> d(c.size())//一定要保证目标元素存在
copy(c.begin(),c.end(), d.begin());
transform(映射)
transform(v.begin(), v.end(), v.begin(), []( int x){return x+2;});//自映射,在自身上面进行修改
transform(dq.begin(), dq.end(), back_inserter(ls),[]( int x){return x+2;});//将映射结果插入到ls尾部
reduce(归约)
accumulate( C++98) 和reduce (C++ 17)
remove_if
对于remove_if,把不满足谓词的元素向前移,返回的迭代器指向位置之前的元素都不满足谓词,后续接erase操作来真正删除满足谓词的那些元素
从c++20起,有更简单的erase_if使用
erase_if(s, [] (int n){return n%2!=0;});
生成
fill(begin(a),end(a),1);
fill_n(first, n ,....);//在c++中,进行char和byte赋值完全可以代替memset

//iota可以填充递增的值
iota(begin(a),end(a),1);// 1 2 3 4 .....

//generate 可以替代上述几个算法
generate(begin(a),end(a),[n=1] () mutable{return n++;});
复制
copy_backward(c.begin(),c.begin()+4,c.end());//后四项用前四项来替代
//第三个参数指向的位置不应该在前面的区间内
//移动方法
c2.resize(c1.size());
copy(move_iterator(c1.begin()), move_iterator(c1.end()), c2.begin());
//或者
c2.reserve(c1.size());
copy(move_iterator(c1.begin()), move_iterator(c1.end()), back_inserter(c2));
//还可以使用move
move(c1.begin(),c1.end(),back_inserter(c2));
//简单通用高效的方法
c2.insert(c2.end(),move_iterator(c1.begin()), move_iterator(c1.end()));


copy_n(begin(c),n,...)
    
copy_if()比起copy多了第四个参数,一个一元谓词
find
it = find(c.begin(), c.end(), 0);

it = find_if(c.begin(), c.end(), []( int n) {return n==0});

//类似的还有count和count_if

all_of/any_of/none_of  //第三个参数接谓词
二分查找
//当我们数据有序时,只需要知道元素是否存在时可以使用
binary_search(c.begin(),c.end(),0);

lower_bound
upper_bound
equal_range
排序
//C++里与排序相关的功能不止sort(全排序)一种:
//如果你需要根据某个标准来把数据分成两组,那partition 就够了。

//如果你需要找出序列里的前n项,保证前n项和后续元素的相对顺序(而不用对前n项或后面的元素进行排序),那可以用nth_element。

//如果你需要找出序列里的前n项,并对前n项进行排序,那可以用partial_sort。

//只有在你确实需要对所有元素都进行排序时,才需要使用sort。

//额外地,如果你不仅需要排序,还希望等价的元素(!compare(a,b)&&!compare(b,a))保持其原有的顺序,应当使用stable_sort。
随机打乱
std::random_device rd;
std::mt19937 g(rd());	// 随机数引擎:基于梅森缠绕器算法的随机数生成器
std::shuffle(v.begin(), v.end(), g);	// 打乱顺序,重新排序(随机序列)
最大最小
minmax(a,b)直接返回最小值和最大值的引用
并行算法
#include <execution>

1. std::execution::seq; //传统的顺序执行策略
2. std::execution::par; //并行执行策略,表示希望使用多个线程
3. std::execution::unseq; //无顺序执行策略,向量化执行
4. std::execution::par_unseq; //并行无顺序,同时多线程和向量化

double res = reduce(execution::par, v.begin(),v.end()); //gcc 编译中需要 -ltbb
c++20的范围算法
using std::ranges::copy;
using std::ranges::sort;
int a[]={1,2,4,3,7,6,5,2};
sort(a);
copy(a,ostream_iterator<int>(cout," "));