了解std :: copy

时间:2018-03-10 18:52:09

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

阅读此代码后,教导如何构建简单的双精度矢量:

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

2 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:0)

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()))