前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不造轮子之STL中的增删改

不造轮子之STL中的增删改

作者头像
程序员的园
发布2024-10-09 21:27:51
510
发布2024-10-09 21:27:51
举报
文章被收录于专栏:程序员的园——原创文章

在日常的开发中,常涉及到容器的常见操作,如查找、删除、排序等,C++ STL提供了丰富的算法库,可以方便的完成这些操作。为了避免重复造轮子,同时为了提高效率,了解常见的STL算法是非常有必要的。本文将介绍增删改相关算法。

1. std::fill

功能:用指定的值填充范围。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec(5);
   std::fill(vec.begin(), vec.end(), 1);
   for (auto i : vec) {
       std::cout << i << " ";
   }
   std::cout << std::endl;
   return 0;
}

std::fill_n

功能:用指定的值填充范围的前n个元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec(5);
   std::fill_n(vec.begin(), 3, 1);
   for (auto i : vec) {
       std::cout << i << " ";
   }
   std::cout << std::endl;
   return 0;
}

2.std::generate

功能:用指定的函数生成值填充范围。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec(5);
   std::generate(vec.begin(), vec.end(), [n = 0]() mutable { return n++; });
   for (auto i : vec) {
       std::cout << i << " "; // 0 1 2 3 4
   }
   std::cout << std::endl;
   return 0;
}

std::generate_n

功能:用指定的函数生成值填充范围的前n个元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec(5);
   std::generate_n(vec.begin(), 3, [n = 0]() mutable { return n++; });
   for (auto i : vec) {
       std::cout << i << " "; // 0 1 2
   }
   std::cout << std::endl;
   return 0;
}

3. std::transform

功能:将范围中的元素通过某种规则转换为另一个范围中的元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec1{ 1, 2, 3, 4, 5 };
   std::vector<int> vec2(5);
   std::transform(vec1.begin(), vec1.end(), vec2.begin(), [](int i) { return i  2; });
   for (auto i : vec2) {
       std::cout << i << " "; // 2 4 6 8 10
   }
   std::cout << std::endl;
   return 0;
}

4. std::copy

功能:将范围中的元素复制到另一个范围中。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec1{ 1, 2, 3, 4, 5 };
   std::vector<int> vec2(5);//预分配空间
   std::copy(vec1.begin(), vec1.end(), vec2.begin());//vec2为目标范围
   for (auto i : vec2) {
       std::cout << i << " "; // 1 2 3 4 5
   }
   std::cout << std::endl;
   return 0;
}

std::copy_n

功能:将范围中的前n个元素复制到另一个范围中。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec1{ 1, 2, 3, 4, 5 };
   std::vector<int> vec2(5);//预分配空间
   std::copy_n(vec1.begin(), 3, vec2.begin());//vec2为目标范围
   for (auto i : vec2) {
       std::cout << i << " "; // 1 2 3
   }
   std::cout << std::endl;
   return 0;
      
}

std::copy_if

功能:将范围中满足条件的元素复制到另一个范围中。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec1{ 1, 2, 3, 4, 5 };
   std::vector<int> vec2(5);//预分配空间
   std::copy_if(vec1.begin(), vec1.end(), vec2.begin(), [](int i) { return i % 2 == 0; });//vec2为目标范围
   for (auto i : vec2) {
       std::cout << i << " "; // 2 4
   }
   std::cout << std::endl;
   return 0;
}

5. std::remove

功能:删除范围中等于指定值的元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
      
   std::vector<int> vec{ 1, 2, 3, 4, 5 };
   vec.erase(std::remove(vec.begin(), vec.end(), 3), vec.end());
   for (auto i : vec) {
       std::cout << i << " "; // 1 2 4 5
   }
   std::cout << std::endl;
   return 0;
}

std::remove_if

功能:删除范围中满足条件的元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 3, 4, 5 };
   vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i) { return i % 2 == 0; }), vec.end());
   for (auto i : vec) {
       std::cout << i << " "; // 1 3 5
   }
   std::cout << std::endl;
   return 0;
}

6. std::replace

功能:将范围中等于指定值的元素替换为另一个值。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 3, 4, 5 };
   std::replace(vec.begin(), vec.end(), 3, 6);
   for (auto i : vec) {
       std::cout << i << " "; // 1 2 6 4 5
   }
   std::cout << std::endl;
   return 0;
}

std::replace_if

功能:将范围中满足条件的元素替换为另一个值。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 3, 4, 5 };  
   std::replace_if(vec.begin(), vec.end(), [](int i) { return i % 2 == 0; }, 6);
   for (auto i : vec) {
       std::cout << i << " "; // 1 6 3 6 5
   }
   std::cout << std::endl;
   return 0;
}

7. std::for_each

功能:对范围中的每个元素执行指定的操作。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 3, 4, 5 };
   std::for_each(vec.begin(), vec.end(), [](int& i) { i = 2; });//对每个元素进行操作
   for (auto i : vec) {
       std::cout << i << " "; // 2 4 6 8 10
   }
   std::cout << std::endl;
   return 0;
}

8. std::reverse

功能:将范围中的元素顺序反转。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 3, 4, 5 };
   std::reverse(vec.begin(), vec.end());
   for (auto i : vec) {
       std::cout << i << " "; // 5 4 3 2 1
   }
   std::cout << std::endl;
   return 0;
}

9. std::swap

功能:交换两个范围中的元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec1{ 1, 2, 3, 4, 5 };
   std::vector<int> vec2{ 6, 7, 8, 9, 10 };
   std::swap(vec1, vec2);
   for (auto i : vec1) {
       std::cout << i << " "; // 6 7 8 9 10
   }
   std::cout << std::endl;
   return 0;
}

std::swap_ranges

功能:交换两个范围中的元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec1{ 1, 2, 3, 4, 5 };
   std::vector<int> vec2{ 6, 7, 8, 9, 10 };
   std::swap_ranges(vec1.begin(), vec1.end(), vec2.begin());
   for (auto i : vec1) {
       std::cout << i << " "; // 6 7 8 9 10
   }
}

10. std::rotate

功能:将范围中的元素向右旋转指定的步数。

代码语言:javascript
复制
template <class ForwardIterator>
void rotate (ForwardIterator first, ForwardIterator middle, 
  ForwardIterator last);

参数

  • first:指向序列开始的迭代器。
  • middle:指向序列中将被旋转到首位的元素的迭代器。
  • last:指向序列结束的迭代器。

代码示例:

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 3, 4, 5 };
   ///
   std::rotate(vec.begin(), vec.begin() + 2, vec.end());
   for (auto i : vec) {
       std::cout << i << " "; // 3 4 5 1 2
   }
   std::cout << std::endl;
   return 0;
}

11. std::unique

功能:删除范围中连续的重复元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 2, 3, 4, 4, 4, 5 };
   vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
   for (auto i : vec) {
       std::cout << i << " "; // 1 2 3 4 5
   }
   std::cout << std::endl;
   return 0;
}

std::unique_copy

功能:将范围中的元素复制到另一个范围,并删除连续的重复元素。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 2, 3, 4, 4, 4, 5 };
   std::vector<int> vec2(vec.size());
   std::unique_copy(vec.begin(), vec.end(), vec2.begin());
   for (auto i : vec2) {
       std::cout << i << " "; // 1 2 3 4 5
   }
   std::cout << std::endl;
   return 0;
}

12. std::clamp

功能:将值限制在指定范围内。小于下限的值将被替换为下限,大于上限的值将被替换为上限。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 3, 4, 5 };
   std::transform(vec.begin(), vec.end(), vec.begin(), [](int i) { return std::clamp(i, 2, 4); });
   for (auto i : vec) {
       std::cout << i << " "; // 2 2 3 4 4
   }
   std::cout << std::endl;
   return 0;
}

13. std::accumulate

功能:计算范围中元素的和。

代码语言:javascript
复制
include <algorithm>
include <vector>
include <iostream>
int main() {
   std::vector<int> vec{ 1, 2, 3, 4, 5 };
   int sum = std::accumulate(vec.begin(), vec.end(), 0);
   std::cout << sum << std::endl; // 15
   return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档