如何不使用循环将std::vector或数组插入std::forward_list中
问题原因
原有代码运行不符合预期的核心问题:空forward_list的begin()方法返回的迭代器与end()迭代器相等,对end()迭代器执行insert_after属于未定义行为,无法完成插入操作。
无循环插入的实现方法
std::forward_list的insert_after本身支持范围插入重载,不需要手动写循环,直接传入待插入范围的首尾迭代器即可:
1. 插入到forward_list头部
这是最常见的场景,直接用before_begin()获取首元素之前的迭代器作为插入位置:
// 直接插入整个vector listOne.insert_after(listOne.before_begin(), arr.begin(), arr.end());
如果是插入普通数组,也可以直接传入数组指针作为迭代器:
int arr[] = {2,4,3}; listOne.insert_after(listOne.before_begin(), std::begin(arr), std::end(arr));
2. 插入到指定位置之后
如果需要插入到forward_list中某个现有元素的后面,只需要拿到该元素的迭代器作为插入位置,同样调用范围插入重载即可:
// 示例:插入到listOne第一个元素之后 auto it = listOne.begin(); listOne.insert_after(it, arr.begin(), arr.end());
3. 初始化时直接导入
如果是新建forward_list时需要导入vector/数组的内容,可以直接在构造函数传入范围迭代器:
std::forward_list<int> listOne(arr.begin(), arr.end());
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

