交换列出了最后一个值c ++的问题

时间:2015-12-18 07:09:51

标签: c++ list pointers this swap

我正在尝试交换两个列表之间的值,它使用我创建的名为ListNum的自定义List类的成员函数,它是具有节点类和迭代器类的朋友。我可以交换它们但我不断得到一个奇怪的错误我不知道如何解决。在第二个列表的最后一个值上,当我尝试实现它时,我收到一个错误。

我只是在两个列表的第一个迭代器之后插入然后删除该元素,迭代器在删除后自动转到列表的下一个值。在最后一次擦除调用中,它会检查要删除的值是否为 “持续”。在第二个列表中,值是“last”但是当它检查if语句“erase”时,此调用失败并且我得到BAD_ACCESS错误。基本上尝试分配导致错误的空指针

值为6,它是最后一个但是if语句失败了。我不确定这是否必须这样做第一个列表我需要创建一个指针,而第二个列表作为参考传递。

这是我的代码。

int main(){

    list1.push_back(1);
    list1.push_back(2);
    list1.push_back(3);

    list2.push_back(4);
    list2.push_back(5);
    list2.push_back(6);

    list1.swap(list2);

 return 1;
}   

这是我试图实现的交换成员函数

void ListNum::swap(ListNum& list2){

    ListNum* list1 = this;

    IteratorNum end1 = list1->end();
    IteratorNum end2 = list2.end();

    IteratorNum start1 = list1->begin();
    IteratorNum start2 = list2.begin();

    while(!start1.equals(end1) && !start2.equals(end2)){

        list1->insert(start1, start2.get());
        list2.insert(start2, start1.get());
        start1 = erase(start1);
        start2 = erase(start2);
    }  
}

代码在if语句的最后一次运行时失败(remove == last)

IteratorNum ListNum::erase(IteratorNum iter){

    assert(iter.position != NULL); //check that erase is not null

    NodeNum *remove = iter.position;
    NodeNum *after = remove->next;
    NodeNum *before = remove->previous;

    if(remove == first)
        first = after;
    else
        before->next = after;

//FAILS HERE, 6 is last int value but it doesn't pass this test. List 1 passes but list 2 does not...
    if(remove == last) //erasing at end of ListNum
        last = before;
    else
        after->previous = before;

    delete remove;

    IteratorNum r;
    r.position = after;
    r.container = this;
    return r;

}

1 个答案:

答案 0 :(得分:2)

首先:不要重新发明轮子。 std::list经过了充分测试,已经实施std::swap()。编写自己的列表对于教育目的非常有用。

无论如何,不​​要自己交换元素,而是指向它们的指针。您的列表可能包含指向第一个和最后一个节点的指针。交换这些指针,也许一些元数据,如大小,你就完成了。