使用std :: copy将元素插入向量

时间:2015-05-28 21:22:37

标签: c++ c++11

在我的手写向量中我需要实现插入函数,所以我这样做:

void insert(size_t index, const T& x) { 
    std::copy(begin() + index, end() - 1, begin() + index + 1);
    new(storage_ + index) T(x); // "storage_" is my vector's inner array
}

这样的测试绝对正确:

myvector<int> v;
for (int i = 0; i < 10; i++)
    v.push_back(i + 1);
v.insert(5, 0); // insert(size_t position, const T& element)

输出:

1 2 3 4 5 0 6 7 8 9 10

(这意味着insert工作正常)

但是我绝对不明白为什么这段代码的工作原理是因为在cplusplus.comlink)上我发现std::copy的工作原理如下:

template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
    while (first!=last) {
        *result = *first;
        ++result; ++first;
    }
return result;
}

但这不是意思,如果我打电话

std::copy(begin() + index, end() - 1, begin() + index + 1);

7执行6时会*result = *first;替换++result; ++first;8之后,它会将6替换为myvector,依此类推。

typedef T* iterator; 中,迭代器的定义如下:

begin

我的end / iterator begin() { return storage_ + 0; } iterator end() { return storage_ + size_; } 是:

.

1 个答案:

答案 0 :(得分:4)

您在那里做的事情不符合std::copy的要求,其中result不在[begin,end)范围内。所以任何事都有可能;你违反了规则。

一切皆有可能,包括它正常工作。通过注意到您违反了要求而转而委托给std::copy_backward,听起来您的特定标准库实现已经决定是仁慈的。它被允许这样做,因为一种可能的未定义行为类型是“#34;东西仍然有用&#34;。