当前位置:   article > 正文

C++ std::copy 应用

std::copy

std::copy

std::copy是C++标准库中的一种算法,它用于将一个范围内的元素从一个位置复制到另一个位置。其函数原型如下:

  1. template <class InputIterator, class OutputIterator>
  2. OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
  3. 这里,firstlast参数定义了源范围的开始和结束,而result参数定义了目标范围的开始。

1、普通应用

例如,如果我们有一个输入向量v1,我们想将其内容复制到另一个向量v2中,我们可以这样使用std::copy:

  1. std::vector<int> v1 = {1, 2, 3, 4, 5};
  2. std::vector<int> v2(v1.size());
  3. std::copy(v1.begin(), v1.end(), v2.begin());

在此例中,v2现在包含与v1相同的元素。
需要注意的是,如果目标范围与源范围有重叠,则使用std::copy可能会导致未定义的行为。在这种情况下,应使用std::copy_if或其他更安全的复制方法。
此外,还可以使用带有两个迭代器对的std::copy来复制一部分序列。例如,要从向量的中间部分开始复制到最后,可以这样做:

  1. std::vector<int> v = {1, 2, 3, 4, 5};
  2. std::vector<int> target(v.size());
  3. std::copy(v.begin() + 1, v.end(), target.begin());

2、升级版应用

即使std::vector存储复合类型该函数依然可以使用,目前亲测vector存入结构体变量,比如存入vector的是一个结构体且结构体中嵌套结构体照样可有效;代码如下

  1. #include <iostream>
  2. #include <vector>
  3. struct DPoint2d
  4. {
  5. union
  6. {
  7. int m_xy[2];
  8. struct
  9. {
  10. int X;
  11. int Y;
  12. };
  13. };
  14. };
  15. enum DLineType
  16. {
  17. ltLine,
  18. ltArc
  19. };
  20. struct Arc2dStru
  21. {
  22. //! 圆心
  23. DPoint2d m_CenterPt;
  24. //! 半径,需大于 0
  25. double m_Radius;
  26. //! 半径乘以圆心角的范围,Range.Max - Range.Min <= Radius * M_2PI
  27. //! 时钟方向,false : 逆时针, true : 顺时针
  28. bool m_Clockwise;
  29. //! 默认构造函数
  30. Arc2dStru() : m_Radius(0), m_Clockwise(false) {}
  31. Arc2dStru& operator =(const Arc2dStru& AStruSrc)
  32. {
  33. m_CenterPt = AStruSrc.m_CenterPt;
  34. m_Radius = AStruSrc.m_Radius;
  35. m_Clockwise = AStruSrc.m_Clockwise;
  36. return *this;
  37. }
  38. };
  39. struct DVertex
  40. {
  41. public:
  42. DPoint2d Point;
  43. DLineType LineType;
  44. Arc2dStru ArcStructInfo;
  45. public:
  46. DVertex(const DLineType& lineTpye, const DPoint2d& Pt, const Arc2dStru AArcStructInfo) {
  47. LineType = lineTpye;
  48. Point = Pt;
  49. ArcStructInfo = AArcStructInfo;
  50. };
  51. DVertex() {};
  52. };
  53. int main() {
  54. // 创建一个源向量
  55. std::vector<DVertex> source;
  56. DVertex vertext;
  57. vertext.LineType = ltArc;
  58. vertext.Point.X = 1;
  59. vertext.Point.Y = 1;
  60. source.push_back(vertext);
  61. vertext.LineType = ltLine;
  62. vertext.Point.X = 5;
  63. vertext.Point.Y = 5;
  64. source.push_back(vertext);
  65. // 创建一个目标向量,其大小等于源向量的大小
  66. std::vector<DVertex> destination(source.size());
  67. // 使用std::copy算法复制数据
  68. std::copy(source.begin(), source.end(), destination.begin());
  69. // 打印目标向量的内容,以验证复制是否成功
  70. for (const auto& vertex : destination) {
  71. std::cout << "Point: " << vertex.Point.X << ", " << vertex.Point.Y << ", LineType: ";
  72. switch (vertex.LineType)
  73. {
  74. case ltArc: std::cout << "弧线"; break;
  75. case ltLine: std::cout << "直线"; break;
  76. }
  77. std::cout << std::endl;
  78. }
  79. //std::cout << std::endl;
  80. return 0;
  81. }

输出如下:

  1. Point: 1, 1, LineType: 弧线
  2. Point: 5, 5, LineType: 直线
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/707800
推荐阅读
相关标签
  

闽ICP备14008679号