初学者想提一个困扰自身许久的问题

Two opened flower 2022-05-21 20:20:04

下列代码可正常执行,且打印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却失败了。

...全文
47 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
发帖
C++ 语言
加入

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
申请成为版主
帖子事件
创建了帖子
2022-05-21 20:20
社区公告
暂无公告