C++ 理解std::copy

C++ 理解std::copy,c++,algorithm,c++11,stdvector,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)

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

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; }
};
arg.elem,arg.elem+sz的范围不应该是

arg.elem, arg.elem + sz - 1

的实现方式如下:

template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last, 
              OutputIt d_first)
{
    while (first != last) {
        *d_first++ = *first++;
    }
    return d_first;
}
不起作用。你必须这样做,这在空向量的情况下是行不通的:

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

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

将迭代器输入到要执行的序列中的初始和最终位置 抄袭的。使用的范围是[第一,最后,它包含所有 第一个和最后一个之间的元素,包括 第一个,但不是最后一个指向的元素


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

为什么这样认为?通常范围的结尾是不包含的,而开头是包含的。这允许您传递空范围。@NeilButterworth,因为arg.elem+sz看起来像是passing一个额外的空元素到该范围。我认为arg.elem意味着elem[0],而arg.elem+sz意味着elem[sz]。好的。我认为它需要作为重复项关闭。没有正确研究。谢谢
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()))