C++;对于每个带有变异向量的循环 我刚刚问了一个关于C++的问题。如果其他人已经问过这个问题,请让我知道,我会将其作为副本删除

C++;对于每个带有变异向量的循环 我刚刚问了一个关于C++的问题。如果其他人已经问过这个问题,请让我知道,我会将其作为副本删除,c++,foreach,iterator,C++,Foreach,Iterator,我的问题本质上是,如果在迭代过程中更改向量,那么for-each循环的行为是什么。例如: int main() { // your code goes here std::vector<char> v; for(char i = 'a'; i <= 'f'; i++) { v.push_back(i); } // v is {a, b, c, d, e, f} char c = 'A'; for(const

我的问题本质上是,如果在迭代过程中更改向量,那么for-each循环的行为是什么。例如:

int main() {
    // your code goes here
    std::vector<char> v;
    for(char i = 'a'; i <= 'f'; i++) {
        v.push_back(i);
    }
    // v is {a, b, c, d, e, f}
    char c = 'A';
    for(const auto &elem : v) {
        cout << elem << ", ";
        v.push_back(c++);     // appending 'A', 'B', 'C', ...
    }
    cout << endl;
    // outputs: "a, b, c, , , ,"  (note there isn't a ... here, the loop stops).


    // Just printing normally now
    cout << "--------" << endl;
    for(const auto &elem : v) {
        cout << elem << ", ";
    }
    cout << endl;
    // outputs: a, b, c, d, e, f, A, B, C, D, E, F,
    return 0;
}
intmain(){
//你的密码在这里
std::向量v;

对于(chari='a';istd::vector::push_-back状态的文档

如果新的size()大于capacity(),则所有迭代器和引用(包括结束迭代器的过去部分)都将无效。否则,只有结束迭代器的过去部分将无效


当for循环递增时,它会将新迭代器位置与v.end()进行比较,并可能进入UB,可能是某些segfault或异常。

std::vector::push_状态的文档

如果新的size()大于capacity(),则所有迭代器和引用(包括结束迭代器的过去部分)都将无效。否则,只有结束迭代器的过去部分将无效



当for循环递增时,它将新的迭代器位置与v.end()进行比较,并可能进入UB,可能是某个segfault或异常。

好吧,我想当调用push_back时,v.end()的值增加1,这就是它不会停止的原因。有关更多信息,您可以查看和链接。@Thanasis,但它确实停止了。我知道我写的内容可能会令人困惑,但它会精确地打印“a,b,c,,”。在迭代时对向量进行变异是相当危险的。在我的系统即OSX中,它不会输出“a,b,c,,”它输出“a,b,c,d,e,f,”我猜C++如何处理这一点取决于实现。你使用什么系统?未定义的行为是不确定的。在向量上做一个保留,这样它就不必重新分配。我想,当你调用PuxFieldBy时,V.端()的值。增加1,这就是它不会停止的原因。有关更多信息,您可以查看和链接。@Thanasis,但它确实停止了。我知道我写的内容可能会令人困惑,但它会精确地打印“a,b,c,,”。在迭代时对向量进行变异是相当危险的。在我的系统即OSX中,它不会输出“a,b,c,,”它输出“a,b,c,d,e,f,”我猜想C++如何处理这一点取决于实现。你使用什么系统?未定义的行为是不确定的。在向量上做一个保留,这样它就不必重新分配。这很有趣。所以理论上,如果我最初把向量足够大,这样就不需要调整大小,那么这个应该正确打印。不,它仍然会尝试T。o每次递增时查看结束迭代器,以测试循环结束条件,但它不能这样做,因为结束无效。我的意思是使用reserve或例如调用
v.push\u back('0')
20次,然后
v.pop\u back()
20次,在第二个for循环之前。这会使容量高于第二个for循环时的大小。哦,你的意思是这样,它只会使所需的迭代器无效,并崩溃吗?@gowarth在ranged for或a for each中,你永远不应该更改数组的大小。即使大小始终小于容量你刹车结束迭代器。这很有趣。所以理论上,如果我一开始就让向量足够大,这样它就不需要调整大小,那么这应该可以正确打印。不,它仍然会在每次你递增时查看结束迭代器,以测试循环结束条件,但它不能这样做,因为结束是无效的。我的意思是u使用reserve或例如调用
v.push_back('0')
20次,然后调用
v.pop_back()
20次,在第二个for循环之前。这会使容量高于第二个for循环时的大小。哦,你的意思是这样,它只会使所需的迭代器无效,并崩溃吗?@gowarth在ranged for或a for each中,你永远不应该更改数组的大小。即使大小始终小于容量您将终止迭代器。
for (auto __begin = v.begin(), __end = v.end();
    __begin != __end; ++__begin) {
    auto elem =  *__begin;
    cout << elem << ", ";
    v.push_back(c++);           // appending 'A', 'B', 'C', ...
}
cout << endl;