考清华还是蓝翔 发表于 2023-7-4 20:17:23

使用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: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(), { 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 以上的功能,以确保插入迭代器相关的函数可以正常使用。

陶远航 发表于 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(), {
      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插入迭代器的那个语句就不会导致内存访问错误了。

sfqxx 发表于 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`三个列表中,并打印输出这三个列表的元素。修正后的代码应该能够正确地将数据插入到各个列表中,并且不会导致内存访问错误。

请注意检查你的代码中是否还有其他类似的错误,以确保正确地使用插入迭代器进行元素插入操作。
页: [1]
查看完整版本: 使用c++插入迭代器造成内存访问错误