gpt4 book ai didi

c++迭代器操作不检查溢出?

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:10 24 4
gpt4 key购买 nike

一旦我写了一行:

while(++itr!=container.end()) 
{
do something here
}

即使在 itr 通过 end() 之后,条件仍然为真。我很困惑。我认为 operator++ 应该检查边界。但似乎不是。这是一个测试程序:

int main()
{
vector<int> x;
vector<string> y;
x.push_back(10);
y.push_back("test");
auto itr = x.end();
assert(itr == x.end());
// this line makes itr past end
++itr;
// this line is true
assert(itr != x.end());
// this line doesn't report any address issue or segment fault
cout << *itr << endl;
auto itry = y.end();
assert(itry == y.end());
++itry;
// no error report
assert(itry != y.end());
// report segment fault
cout << *itry << endl;
return 0;
}

std c++ 中的迭代器是否真的不检查过去的结束或 begin() 之前的 -- 运算符?

最佳答案

这就是它们的工作方式,这是出于性能原因。迭代器是在指针之后建模的,指针不会在递增时检查边界。

如果递增超过 end(),您将得到未定义的行为。

关于c++迭代器操作不检查溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21323901/

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