STL区间成员函数及区间算法总结
在这里总结下可替代循环的区间成员函数和区间算法; 相比单元素遍历操作,使用区间成员函数的优势在于: 在区间成员函数不适用的情况下也应该使用区间算法,至少,相比手写循环而言,它更加简单,有效,并且不容易出错; 区间成员函数 区间构造 标准容器都支持区间构造函数: 复制代码 代码如下: container::container(InputIterator begin,// 区间的起点 InputIterator end); // 区间的终点 例如: 复制代码 代码如下: int myints[] = { 10,20,30,10,20 }; std::vector<int> myvector (myints,myints+8); 以上是c++98中常用法,在C++11中,vector可以直接初始化了: 复制代码 代码如下: std::vector<int> second ={10,20}; 或者: 复制代码 代码如下: std::vector<int> second ({10,20}); 区间插入 标准序列容器提供这种形式的insert: 复制代码 代码如下: void container::insert(iterator position,// 区间插入的位置 InputIterator begin,// 插入区间的起点 InputIterator end); // 插入区间的终点 例如: 复制代码 代码如下: int myints[] = { 10,20 }; std::vector<int> myvector; myvector.push_back(100); myvector.insert(myvector.begin(),myints,myints+8); //10 20 30 30 20 10 10 20 100 关联容器也支持区间插入,但由于其插入后的位置由其比较函数来决定,所以没有区间插入的位置这个参数; 区间删除 标准序列容器提供的erase: iterator container::erase(iterator begin,iterator end); c++98的标准关联容器提供的erase为: void container::erase(iterator begin,iterator end); 序列容器调用erase之后,返回一个迭代器(被删除的那个元素的下一个), 这一区别在c++11中终于统一了;c++11中,对关联容器调用erase之后会返回一个迭代器(指向被删除元素的下一个); iterator container::erase(const_iterator first,const_iterator last); 区间赋值 所有标准容器提供了区间赋值的成员函数: void container::assign(InputIterator begin,InputIterator end); 复制代码 代码如下: int myints[]={10,40,50,60,70}; std::vector<int> myvector; myvector.assign(myints,myints+7); 通用区间算法 for_each 区间迭代 for_each:遍历,对每个元素都执行一个动作; 例:对每个元素都加5: 复制代码 代码如下: void myfunction (int& i) { i += 5; } std::vector<int> myvector; myvector.push_back(10); myvector.push_back(20); myvector.push_back(30); for_each(myvector.begin(),myvector.end(),myfunction); //15 25 35 c++11中新增了区间迭代,使得我们对for_each的依赖降低了,使用也更加方便: 复制代码 代码如下: for(auto &i : myvector ) { i+=5; } transform() 区间迭代后新值另存为其它地方 对区间中每个元素执行操作后,将修改后的值写入到新区间中; 复制代码 代码如下: int addfunction(int i ){ return i+5; } void output (int i) { // output function std::cout << ' ' << i; } std::vector<int> myvector; myvector.push_back(10); myvector.push_back(20); myvector.push_back(30); std::vector<int> bvector; bvector.resize(myvector.size()); transform(myvector.begin(),bvector.begin(),addfunction); //输出 for_each(bvector.begin(),bvector.end(),output); //bvector: 15 25 35 copy() 区间复制 区间复制,一般用于多个容器间的数据传值; 例:复制数组到vector: 复制代码 代码如下: int myints[]={10,70}; std::vector<int> myvector (7); std::copy ( myints,myints+7,myvector.begin() ); fill() 区间填充 用一个元素来重复填充区间; 复制代码 代码如下: std::vector<int> myvector (8); // myvector: 0 0 0 0 0 0 0 0 std::fill (myvector.begin(),myvector.begin()+4,5); // myvector: 5 5 5 5 0 0 0 0 replace() 区间替换 遍历区间,进行值替换: 复制代码 代码如下: int myints[] = { 10,myints+8); // 10 20 30 30 20 10 10 20 std::replace (myvector.begin(),99); // 10 99 30 30 99 10 10 99 更复杂的版本(使用仿函数)replace_if 复制代码 代码如下: bool bigerThen20 (int i) { return i > 20; } int myints[] = { 10,myints+8); // 10 20 30 30 20 10 10 20 std::replace_if (myvector.begin(),bigerThen20,99); //10 20 99 99 20 10 10 20 由于用到了仿函数,通过replace_if实现的,用for_each()也很容易实现; remove() 区间删除 从区间中删除指定元素; 复制代码 代码如下: int myints[] = { 10,myints+8); // 10 20 30 30 20 10 10 20 std::remove(myvector.begin(),20); // 10 30 30 10 10 ? ? ? 注意,remove并不会真正删除元素,而只是将需要删除的元素放到到最后,同时返回一个新的尾部迭代器, 复制代码 代码如下: myvector.erase(std::remove(myvector.begin(),20),myvector.end()); // 10 30 30 10 10 unique() 区间去重 从区间中删除相邻相同的元素,同样,这个算法也不会真正的删除元素,而是将待删除的元素移到区间尾部; 复制代码 代码如下: int myints[] = {10,10}; // 10 20 20 20 30 30 20 20 10 std::vector<int> myvector (myints,myints+9); std::vector<int>::iterator it; it = std::unique (myvector.begin(),myvector.end()); // 10 20 30 20 10 ? ? ? ? myvector.erase(it,myvector.end()); 以上所述就是本文的全部内容了,希望大家能够喜欢。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |