gpt4 book ai didi

c++ - 为什么这里打印的 vector 内容是错误的?

转载 作者:行者123 更新时间:2023-11-30 02:23:30 26 4
gpt4 key购买 nike

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
int test=0;
vector<int>v{1,2,3};
for(auto i=v.cbegin();i!=v.cend();++i)
{
++test;
if(test==2)
{
v.push_back(4);
}
cout<<*i<<endl;
}
return 0;
}

我预计输出仅为 1 2 3 4 但我收到如下所示的输出:

image

最佳答案

如果新项不适合 vector 容量(内部大小),push_back 可以更改开始和结束迭代器。在您的示例中, push_back 意味着内部缓冲区的重新分配,并且开始和结束迭代器获得新值。您的示例中的问题是,将针对每个步骤评估结束迭代器并获得新值,但开始迭代器仍保留旧(无效)值,这会导致未定义的行为。以下更改将说明会发生什么:

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int test=0;
vector<int>v{1,2,3};
for(auto i=v.cbegin();i!=v.cend();++i)
{
++test;
if(test==2)
{
std::cout << &*v.cbegin()<<std::endl;
std::cout << &*v.cend()<<std::endl;
v.push_back(4);
std::cout << &*v.cbegin()<<std::endl;
std::cout << &*v.cend()<<std::endl;
}
cout<<*i<<endl;
}
return 0;
}

如您所见,开始和结束迭代器完全改变了

show result

关于c++ - 为什么这里打印的 vector 内容是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46206455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com