65,187
社区成员




下列代码可正常执行,且打印1 2 3
std::allocator<int> alloc;
auto begin = alloc.allocate(3);
std::vector<int> ivec = { 1,2,3 };
std::uninitialized_copy(ivec.begin(), ivec.end(), begin);
for (auto q = begin; q != begin + 3; ++q)
cout << *q << " ";
alloc.deallocate(begin, 3);
下列代码运行时报错,提示cannot seek vector iterator after end
std::vector<int> ivec_1 = { 1,2,3 };
std::vector<int> ivec_2;
ivec_2.reserve(3);
std::uninitialized_copy(ivec_1.begin(), ivec_1.end(), ivec_2.begin());
我知道报错说明是迭代器超出了尾后迭代器,因为在一个接受三个迭代器的泛型算法中,总是假定目的位置序列至少能够容纳源序列元素,目的位置
序列的大小至少和源序列一样大。问题是:这里的一样大,指的是目的位置的元素个数与源序列的实际元素个数一样多,还是仅仅是所分配的、容器所拥有的内存空间一样多?
1.如果指的是实际元素个数一样多,那么为什么第一种写法不报错?allocate算法分配空间,但是这些空间都是未构造的、未初始化的,里面并无任何元素,但是调用uninitialized_copy算法成功地将源序列元素拷贝到了未构造的内存中。
2.如果指的是内存空间一样多(不要求内存中构造了元素),那么为什么第二种写法会报错?ivec_2一开始是空容器,我调用reserve函数为其分配了3个空间,并且也调用了capacity()进行了验证,确实分配了3个空间且尚未构造元素,此时调用uninitialized_copy却失败了。