|
发表于 2023-7-4 20:17:50
|
显示全部楼层
问题标题:使用C++插入迭代器造成内存访问错误
问题内容:
我使用插入迭代器向链表里面写入数据,现在将第一个链表中的内容分别用inserter、front_inserter和back_inserter插入到其他三个列表中,其中前两个插入没有问题,为什么在使用back_inserter的那个语句会导致内存访问错误?
- cpp
- #include <iostream>
- #include <list>
- #include <iterator>
- #include <algorithm>
- int main() {
- std::list<int> il1 = { 1,2,3,4 };
- std::list<int> il2, il3, il4 ;
- // 以下三句是存在问题的地方
- // 没有问题
- copy(il1.begin(), il1.end(), inserter(il2, il2.begin()));
- // 没有问题
- copy(il1.begin(), il1.end(), front_inserter(il3));
- // 内存访问错误
- copy(il1.begin(), il2.end(), back_inserter(il4));
- for_each(il2.cbegin(), il2.cend(), [url=int i][/url] {
- std::cout << i << " ";
- });
- std::cout << std::endl;
- for_each(il3.cbegin(), il3.cend(), [url=int i][/url] {
- std::cout << i << " ";
- });
- std::cout << std::endl;
- for_each(il4.cbegin(), il4.cend(), [url=int i][/url] {
- std::cout << i << " ";
- });
- std::cout << std::endl;
- return 0;
- }
复制代码
回答:
在你的代码中,使用back_inserter插入迭代器导致内存访问错误的原因是在最后一行的语句copy(il1.begin(), il2.end(), back_inserter(il4));中,使用了il2.end()作为copy函数的结束位置参数。
这里应该将il1的元素复制到il4中,而不是将il1和il2混淆。所以需要将语句改为copy(il1.begin(), il1.end(), back_inserter(il4));。
修正后的代码如下:
- cpp
- #include <iostream>
- #include <list>
- #include <iterator>
- #include <algorithm>
- int main() {
- std::list<int> il1 = { 1,2,3,4 };
- std::list<int> il2, il3, il4 ;
- copy(il1.begin(), il1.end(), inserter(il2, il2.begin()));
- copy(il1.begin(), il1.end(), front_inserter(il3));
- copy(il1.begin(), il1.end(), back_inserter(il4));
- for_each(il2.cbegin(), il2.cend(), [url=int i][/url] {
- std::cout << i << " ";
- });
- std::cout << std::endl;
- for_each(il3.cbegin(), il3.cend(), [url=int i][/url] {
- std::cout << i << " ";
- });
- std::cout << std::endl;
- for_each(il4.cbegin(), il4.cend(), [url=int i][/url] {
- std::cout << i << " ";
- });
- std::cout << std::endl;
- return 0;
- }
复制代码
这样修改后,使用back_inserter插入迭代器的那个语句就不会导致内存访问错误了。 |
|