使用c++插入迭代器造成内存访问错误
我使用插入迭代器向链表里面写入数据,现在将第一个链表中的内容内别用inserter,front_inserter和back_inserter插入到其他三个列表中,其中前两个插入没有问题,为什么在使用back_inserter的那个语句会导致内存访问错误
#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(), [](int i) {std::cout << i << " "; });
std::cout << std::endl;
for_each(il3.cbegin(), il3.cend(), [](int i) {std::cout << i << " "; });
std::cout << std::endl;
for_each(il4.cbegin(), il4.cend(), [](int i) {std::cout << i << " "; });
std::cout << std::endl;
return 0;
} 本帖最后由 编程追风梦 于 2023-7-4 20:20 编辑
back_inserter 使用的参数不正确,导致了内存访问错误。在 copy 函数中,应该使用 il1.end() 而不是 il2.end() 作为完成迭代的终点。
改一下差不多是这样
<b>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)); // 此处修正为 il1.end()
for_each(il2.cbegin(), il2.cend(), { std::cout << i << " "; });
std::cout << std::endl;
for_each(il3.cbegin(), il3.cend(), { std::cout << i << " "; });
std::cout << std::endl;
for_each(il4.cbegin(), il4.cend(), { std::cout << i << " "; });
std::cout << std::endl;
return 0;
}
</b>
这样修改后,代码应该能将 il1 的内容插入到 il4 中,并输出三个链表的内容。
同时,请确保的编译器和标准库支持 C++11 以上的功能,以确保插入迭代器相关的函数可以正常使用。
问题标题:使用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(), {
std::cout << i << " ";
});
std::cout << std::endl;
for_each(il3.cbegin(), il3.cend(), {
std::cout << i << " ";
});
std::cout << std::endl;
for_each(il4.cbegin(), il4.cend(), {
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(), {
std::cout << i << " ";
});
std::cout << std::endl;
for_each(il3.cbegin(), il3.cend(), {
std::cout << i << " ";
});
std::cout << std::endl;
for_each(il4.cbegin(), il4.cend(), {
std::cout << i << " ";
});
std::cout << std::endl;
return 0;
}
这样修改后,使用back_inserter插入迭代器的那个语句就不会导致内存访问错误了。 在你的代码中,使用插入迭代器向三个列表中插入元素时,确实存在内存访问错误。问题出现在使用`back_inserter`插入迭代器时,具体原因是:
copy(il1.begin(), il2.end(), back_inserter(il4));
上述代码中,使用`copy`算法将`il1`列表的元素复制到`il4`列表时,你应该使用`il1`的迭代器作为结束迭代器,即`il1.end()`,而不是使用`il2`的迭代器`il2.end()`。
修正后的代码如下:
copy(il1.begin(), il1.end(), back_inserter(il4));
以下是修正后的完整代码:
#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(), [](int i) { std::cout << i << " "; });
std::cout << std::endl;
for_each(il3.cbegin(), il3.cend(), [](int i) { std::cout << i << " "; });
std::cout << std::endl;
for_each(il4.cbegin(), il4.cend(), [](int i) { std::cout << i << " "; });
std::cout << std::endl;
return 0;
}
这段代码使用三种插入迭代器分别将`il1`列表中的元素插入到`il2`、`il3`和`il4`三个列表中,并打印输出这三个列表的元素。修正后的代码应该能够正确地将数据插入到各个列表中,并且不会导致内存访问错误。
请注意检查你的代码中是否还有其他类似的错误,以确保正确地使用插入迭代器进行元素插入操作。
页:
[1]