在我的手写向量中我需要实现插入函数,所以我这样做:
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.com
(link)上我发现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_;
}
是:
.
答案 0 :(得分:4)
您在那里做的事情不符合std::copy
的要求,其中result
不在[begin,end)
范围内。所以任何事都有可能;你违反了规则。
一切皆有可能,包括它正常工作。通过注意到您违反了要求而转而委托给std::copy_backward
,听起来您的特定标准库实现已经决定是仁慈的。它被允许这样做,因为一种可能的未定义行为类型是“#34;东西仍然有用&#34;。