C++ std::copy 应用

文章介绍了C++标准库中的std::copy算法,演示了如何在复制向量和结构体,包括嵌套结构,时使用该函数。还讨论了重叠范围和不同应用场景的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

std::copy

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

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

1、普通应用

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

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

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

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

2、升级版应用

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

#include <iostream>
#include <vector>  

struct DPoint2d
{
    union
    {
        int m_xy[2];
        struct
        {
            int X;
            int Y;
        };
    };
};
enum DLineType
{
    ltLine,
    ltArc
};
struct Arc2dStru
{
    //! 圆心
    DPoint2d m_CenterPt;
    //! 半径,需大于 0
    double m_Radius;
    //! 半径乘以圆心角的范围,Range.Max - Range.Min <= Radius * M_2PI
    //! 时钟方向,false : 逆时针, true : 顺时针
    bool m_Clockwise;
    //! 默认构造函数
    Arc2dStru() : m_Radius(0), m_Clockwise(false) {}

    Arc2dStru& operator =(const Arc2dStru& AStruSrc)
    {
        m_CenterPt = AStruSrc.m_CenterPt;
        m_Radius = AStruSrc.m_Radius;
        m_Clockwise = AStruSrc.m_Clockwise;
        return *this;
    }
};
struct DVertex 
{
public:
    DPoint2d Point;
    DLineType LineType;
    Arc2dStru ArcStructInfo;
public:
    DVertex(const DLineType& lineTpye, const DPoint2d& Pt, const Arc2dStru AArcStructInfo) {
        LineType = lineTpye;
        Point = Pt;
        ArcStructInfo = AArcStructInfo;
    };
    DVertex() {};
};

int main() {
    // 创建一个源向量  
    std::vector<DVertex> source;
    DVertex vertext;
    vertext.LineType = ltArc;
    vertext.Point.X = 1;
    vertext.Point.Y = 1;
    source.push_back(vertext);
    vertext.LineType = ltLine;
    vertext.Point.X = 5;
    vertext.Point.Y = 5;
    source.push_back(vertext);
    // 创建一个目标向量,其大小等于源向量的大小  
    std::vector<DVertex> destination(source.size());

    // 使用std::copy算法复制数据  
    std::copy(source.begin(), source.end(), destination.begin());

    // 打印目标向量的内容,以验证复制是否成功  
    for (const auto& vertex : destination) {
        std::cout << "Point: " << vertex.Point.X << ", " << vertex.Point.Y << ", LineType: ";
        switch (vertex.LineType) 
        {
        case ltArc: std::cout << "弧线"; break;
        case ltLine: std::cout << "直线"; break;
        }
        std::cout << std::endl;
    }
    //std::cout << std::endl;

    return 0;
}

输出如下:

Point: 1, 1, LineType: 弧线
Point: 5, 5, LineType: 直线
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西北风^_^

一毛一次,一次一毛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值