C++ std::矢量迭代器行为奇怪,不允许增量
C++ std::vector iterator acting strange, won't allow incrementation
我正在尝试在 c++ 中使用std::vector
,特别是类型std::string
的一种。但是,当我尝试将元素插入std::vector
并打印出来时,迭代器的行为很奇怪。 以下代码仅打印"分段错误":
std::vector<std::string> request;
auto it = request.begin();
request.insert(it, "foo");
request.insert(++it, "bar");
std::cout << request.front() + "n";
当我保持迭代器不变时,代码还会打印"分段错误",即如果我不尝试递增它。如果我注释掉在代码中插入"bar"的行,即没有it
增量(++it
),代码会打印"foo"。此外,我可以使用request.begin()
或request.end()
添加"bar",它会打印正确的东西(分别为"bar"或"foo")。我在这里问这个是因为这种行为与 cplusplus.com 上给出的std::vector.insert()
教程中显示的行为不匹配,似乎也与在线上的任何其他示例不匹配,而且我似乎无法弄清楚为什么它会打印"分段错误",如果您尝试打印不存在的元素,我认为会发生这种情况, 或者至少当我在一个空向量上测试这个理论时,这就是发生的事情。
问题是it
不需要成为有效的迭代器,之后
request.insert(it, "foo");
因此,在下一行中使用++it
,如
request.insert(++it, "bar");
是未定义行为的原因。
您可以使用
it = request.insert(it, "foo");
request.insert(++it, "bar");
相关文章:
- std::带有自定义缓冲区的 iostream 不允许我写入
- C++ std::矢量迭代器行为奇怪,不允许增量
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 为什么 std::array 的演绎指南不允许不同的类型?
- 封装 std::vector 以允许迭代,但不允许其他内容
- std::function 中不允许引用返回类型吗?
- 网站组装 |错误:'C/ObjC'不允许使用无效'-std=c++11'参数
- 为什么 std::d eque 不允许指定存储桶大小?
- 为什么不允许 std::variant 与其替代类型之一相等?
- 为什么 std::optional 不允许"move construct and copy assign only"类型的移动分配?
- 为什么GCC不允许我创建"内联静态std::stringstream"?
- 不确定的std::system_error:what():不允许操作
- std::map的迭代器,允许修改值,但不允许插入/删除
- Mac gcc 不允许显式调用 std::string::~string
- std::函数参数不完整,不允许使用类型
- 为什么标准不允许 std::for_each 对无效的随机访问迭代器范围有明确定义的行为?
- 错误:不允许使用"C++/ObjC++"使用无效参数"-std=gnu99"
- 为什么在c++ 11中将std::pair类标准更改为不允许只有非常量复制构造函数的类型?
- 为什么不允许使用"std::uniform_int_distribution<uint8_t>"和"std::<int8_t>uniform_int_distribution"
- std::initializer_list不允许缩小