std :: list push back添加了两个元素而不是一个元素

时间:2018-04-06 16:56:30

标签: c++ list

我尝试将元素添加到列表中,但无法弄清楚push_back方法重复最后添加的元素的原因。举例说明:

enter image description here

每个节点对象都包含datahead字段。在下面的代码中,我遍历一个int数组,创建一个新节点来存储每个int,并push_back该元素到列表L。重复节点始终是添加到列表中的最后一个节点(在上图中,当iteratror i = 1时)

void addElements(std::list<node>& L, int arr[],std::list<node>::iterator Itor,int size){ //array decays to pointer
    for (int i=1;i<size;i++){
        node* n = new node;
        n->data = arr[i];
        n->head = Itor->head; //head of the first element in the list
        L.push_back(*n);
    }
}

我在下面列出了不相交数据结构的完整代码。我在cplusplus.com上看到push_back将容器大小增加了1.所以我有点困惑为什么要在列表中添加额外的节点。

#include <iostream>
#include <list>

struct node{
    int data;
    node* head;
};

void makeSet(std::list<node>& L,int arr[]){ //asterick is before the variable name
    node *headNode = new node;
    headNode->data = arr[0]; //representative node
    headNode->head = headNode; //point to itself
    L.push_back(*headNode);
}

void addElements(std::list<node>& L, int arr[],std::list<node>::iterator Itor,int size){ //array decays to pointer
    for (int i=1;i<size;i++){
        node* n = new node;
        n->data = arr[i];
        n->head = Itor->head; //head of the first element in the list
        L.push_back(*n);
    }
}

int findSet(node* element){
    return element->head->data;
}
int main(int argc, const char * argv[]) {
    std::list<node>List;
    std::list<node>::iterator Itor;
    int dataArr[]={1,2,3,4,5};
    int size = sizeof(dataArr)/sizeof(dataArr[0]);
    Itor = List.begin();
    makeSet(List,dataArr);
    addElements(List,dataArr,Itor,size);
    for (Itor = List.begin();Itor!=List.end();Itor++){
        std::cout << Itor->data << std::endl;
    }
}

1 个答案:

答案 0 :(得分:1)

请注意,示例中列表的大小为2.这意味着只有节点0和1有效。这个额外的重复链接可能是Sentinel Value

通常,您会发现链接列表以空指针终止,但将列表末尾定义为指向自身的链接同样容易。这可能具有其他优势,例如提供一个过去的结尾链接以list::end返回。

无论它的好处是什么,它都超出了列表的范围,所以最好不要搞砸它。