鱼C论坛

 找回密码
 立即注册
查看: 866|回复: 3

[已解决]使用c++插入迭代器造成内存访问错误

[复制链接]
发表于 2023-7-4 20:17:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我使用插入迭代器向链表里面写入数据,现在将第一个链表中的内容内别用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:17:46
本帖最后由 编程追风梦 于 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(), [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;
}
</b>


这样修改后,代码应该能将 il1 的内容插入到 il4 中,并输出三个链表的内容。

同时,请确保的编译器和标准库支持 C++11 以上的功能,以确保插入迭代器相关的函数可以正常使用。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-4 20:17:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 编程追风梦 于 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(), [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;
}
</b>


这样修改后,代码应该能将 il1 的内容插入到 il4 中,并输出三个链表的内容。

同时,请确保的编译器和标准库支持 C++11 以上的功能,以确保插入迭代器相关的函数可以正常使用。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 20:17:50 | 显示全部楼层
问题标题:使用C++插入迭代器造成内存访问错误
问题内容:
我使用插入迭代器向链表里面写入数据,现在将第一个链表中的内容分别用inserterfront_inserterback_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中,而不是将il1il2混淆。所以需要将语句改为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插入迭代器的那个语句就不会导致内存访问错误了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 20:21:24 | 显示全部楼层
在你的代码中,使用插入迭代器向三个列表中插入元素时,确实存在内存访问错误。问题出现在使用`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`三个列表中,并打印输出这三个列表的元素。修正后的代码应该能够正确地将数据插入到各个列表中,并且不会导致内存访问错误。

请注意检查你的代码中是否还有其他类似的错误,以确保正确地使用插入迭代器进行元素插入操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 01:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表