c++ 使用迭代器将元素插入向量没有效果[duplicate]

jyztefdp  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(175)

此问题在此处已有答案

Iterator invalidation rules for C++ containers(6个答案)
What is iterator invalidation?(3个答案)
6小时前关门了。
请看下面的MRE:

#include <iostream>
#include <vector>
#include <iterator>

void display(const std::vector<std::string> &v){
    for(int i = 0; i < v.size(); i++){
        std::cout << v[i] << " ";
    }
    std::cout << std::endl;
}

int main(){
    std::vector<std::string> vect1;
    std::vector<std::string>::iterator i1 = vect1.begin();

    vect1.push_back("Test");
    display(vect1);
    std::cout << *i1 << std::endl;
    vect1.insert(i1, "Apple");
    std::cout << vect1.size() << std::endl;
    display(vect1);

    return 0;
}

当我尝试使用insert函数向vect1添加一个新元素时,矢量内容保持不变(根据display函数的输出)。

j5fpnvbx

j5fpnvbx1#

迭代器

i1=vect1.begin();

如果size的值大于0,则在for循环(其中新元素被添加到向量中)之后,此语句将变为无效。否则,此语句

cout<<*i1<<endl;

将调用未定义的行为。
将此语句移到for循环之后。

i1=vect1.begin();

if ( !vect1.empty() ) cout<<*i1<<endl;

cout<<endl<<endl<<"***Inserting the string (Apple) At Index 1"<<endl;
vect1.insert(i1,"Apple");

请注意,消息

"***Inserting the string (Apple) At Index 1"

不正确。因为迭代器it指向向量的第一个元素,所以字符串存储在索引0处。也就是说,您应该使用message

"***Inserting the string (Apple) At Index 0"

相关问题