拼接列表后,迭代器存储了错误的值
Iterator stores the wrong value after splicing list
我有一些简单的代码。
#include <iostream>
#include <list>
std::list<int> A;
std::list<int> B;
std::list<int>::iterator location;
int main()
{
A.push_back( 1 );
location = A.begin();
B.splice( B.end(), A, A.begin() );
std::cout<< (*location) <<std::endl;
}
编译后,我得到运行时错误:List迭代器不可解引用。我该如何解决这个问题?
您正在使用的std::splice::list
的重载使指向拼接元素的迭代器无效。从 23.2.2.4列表操作 [lib.list.ops] :
void splice(iterator position, list<T,Allocator>& x, iterator i);
Effects:在列表x的位置前插入一个i所指向的元素,并从x中删除该元素Position == I或Position == ++ I。只使迭代器和失效对拼接元素的引用。
(强调我的)
因此,在您的情况下,在拼接之前用A.begin()
初始化的location
变得无效。这种行为似乎在c++ 11中发生了变化,其中维护了迭代器的有效性(参见工作示例)。
相关文章:
- OpenCV 4.2.0 文件存储分段错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- 使用 char* 存储数据和产生的错误
- 将 c++ cmake-library 构建发布到本地存储库时出现 Gradle 错误
- 在自定义 STUCT 中存储值会产生编译器错误 [C++]
- 将 lambda 存储为 std::函数时出现分段错误
- 尝试将现有数组的反向存储到另一个数组中时C++错误。无法使用指针
- 在向量中存储字符串存在 SEG 错误
- OpenCV 文件存储 - 错误:元素之间的解析错误 (icvYMLParseValue) 缺失
- 将自定义可绘制对象存储在数组中会导致绘制时出现分割错误
- 为什么这段代码给出错误......'a'是指针到字符指针,应该存储's'的地址,因为s是指向数组的第一个元素的指针
- 代码将向量存储为向量<vector>,为什么没有错误消息?
- 将向量对象存储在共享指针投掷错误中
- Boost::序列化存储结构时的堆栈溢出错误
- 尝试读取包含 ints 并存储在 int vector 中的文件,但我不断收到错误"Segmentation fault (core dumped)"
- 读取文件时错误,其存储替代行数据
- 替换WCHAR_T错误返回存储地址
- SQL Server 2016 CLR 存储过程错误:"A system assertion check has failed"
- 在与C 双打中存储的大整数时,如何避免舍入/精确错误
- 当某些错误可以接受时,顺序加载存储原子的内存顺序应该是什么