问题标题:使用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插入迭代器的那个语句就不会导致内存访问错误了。 |