考虑这个假设的实现vector
:
template<class T> // ignore the allocator
struct vector
{
typedef T* iterator;
typedef const T* const_iterator;
template<class It>
void insert(iterator where, It begin, It end)
{
...
}
...
}
问题
我们在这里面临一个微妙的问题:和
有可能引用同一向量中的项目,之后。begin
end
where
例如,如果用户说:
vector<int> items;
for (int i = 0; i < 1000; i++)
items.push_back(i);
items.insert(items.begin(), items.end() - 2, items.end() - 1);
如果It
不是指针类型,那么我们很好。
但我们不知道,所以我们必须检查它[begin, end)
是否引用了向量中已经存在的范围。
但是我们该怎么做呢?根据 C++,如果它们不引用同一个数组,那么指针比较将是未定义的!
因此编译器可能会错误地告诉我们这些项目没有别名,而实际上它们确实如此,从而给我们带来了不必要的 O(n) 减速。
潜在的解决方案和警告
一种解决方案是每次都复制整个向量,以包含新项目,然后丢弃旧副本。
但在上面的例子中,这非常慢,我们复制 1000 个项目只是为了插入 1 个项目,即使我们显然已经有足够的容量。