【问题标题】:Understanding std::copy [duplicate]了解 std::copy [重复]
【发布时间】:2018-08-19 03:35:49
【问题描述】:

读完这段代码,教你如何构建一个简单的双精度向量:

class vector
{
    int sz;
    double* elem;

public:
    vector(int s)
        :sz{s}, elem{new double[sz]}
    {
        for (int i = 0; i < sz; ++i)elem[i] = 0.0;
    }
    vector(initializer_list<double>lst)
        :sz{ int(lst.size()) }, elem{ new double[sz] }
    {
        copy(lst.begin(), lst.end(), elem);
    }
    vector(const vector&);
    ~vector(){ delete[] elem; }
    double get(int n) const { return elem[n]; }
    void set(int n, double v) { elem[n] = v; }
};

复制构造函数定义为:

vector::vector(const vector& arg)
    :sz{ arg.sz }, elem{new double[arg.sz]}
{
    copy(arg.elem, arg.elem + sz, elem);
}

arg.elem, arg.elem + sz 的范围实际上不应该是

arg.elem, arg.elem + sz - 1

?

【问题讨论】:

  • 你为什么这么认为?
  • 通常范围的结尾不包括在内,而开头是。这允许您传递空范围。
  • @NeilButterworth 因为 arg.elem + sz 看起来它正在向范围传递一个额外的空元素。我认为 arg.elem 暗示 elem[0] 而 arg.elem + sz 暗示 elem[sz]。

标签: c++ algorithm c++11 stdvector


【解决方案1】:

在 C++ 中,各种函数接受一个开始迭代器或指针,以及一个结束迭代器或指针。开始迭代器包含在任何操作中,无论是复制还是排序或其他操作,但不包括结束迭代器或指针。通常操作是开始迭代器到(结束迭代器 - 1)。来自 std::copy 的文档:

输入迭代器到序列中的初始和最终位置 复制。使用的范围是 [first,last),其中包含所有 第一个和最后一个之间的元素,包括指向的元素 first 但不是 last 指向的元素。

这就是为什么在容器中 end() 迭代器不指向最后一个元素。例如,std::vector::end() 是一个迭代器,指向最后一个成员。

【讨论】:

    【解决方案2】:

    std::copy 被实现为:

    template<class InputIt, class OutputIt>
    OutputIt copy(InputIt first, InputIt last, 
                  OutputIt d_first)
    {
        while (first != last) {
            *d_first++ = *first++;
        }
        return d_first;
    }
    

    last 指向的元素未被复制。如果是则如下代码:

    std::vector<int> in;
    std::vector<int> out;
    std::copy(in.begin(), in.end(), std::back_inserter(out.begin()))
    

    行不通。你必须做这样的事情,这在空向量的情况下不起作用:

    std::vector<int> in;
    std::vector<int> out;
    std::copy(in.begin(), in.end() - 1, std::back_inserter(out.begin()))
    

    【讨论】:

    • 好的..认为它需要作为重复关闭。没有好好研究。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多