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

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却失败了。

...全文
145 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧