gpt4 book ai didi

c++ - 列表迭代器不迭代所有元素

转载 作者:太空宇宙 更新时间:2023-11-04 15:07:29 26 4
gpt4 key购买 nike

我有一个 TreeVertex 类:

// TreeVertex.h
#ifndef __TREEVERTEX__
#define __TREEVERTEX__

#include <list>

using namespace std;

class TreeVertex {
public:
TreeVertex(list<int>, TreeVertex* = NULL);
list<int> getItemset();
private:
list<int> Itemset;

TreeVertex * Parent;
TreeVertex * LeftChild;
TreeVertex * RightSibling;
};

#endif // __TREEVERTEX__

// TreeVertex.cpp

#include "TreeVertex.h"

TreeVertex::TreeVertex(list<int> Itemset, TreeVertex* Parent) : Itemset(Itemset), Parent(Parent), LeftChild(NULL),
RightSibling(NULL) { }

list<int>
TreeVertex::getItemset() {
return Itemset;
}

还有一个像这样的主要功能:

#include <iostream>
#include "TreeVertex.h"

using namespace std;

int main (int argc, const char ** const argv)
{
list<int> tmpList1;
tmpList1.push_back(1);

TreeVertex * tmpTreeVert1 = new TreeVertex(tmpList1);

list<int> tmpList2;
tmpList2.push_back(2);

TreeVertex * tmpTreeVert2 = new TreeVertex(tmpList2);

list<int> newVertItemset;

newVertItemset.push_back(tmpTreeVert1->getItemset().front());
newVertItemset.push_back(tmpTreeVert2->getItemset().front());

cout << newVertItemset.front() << " " << newVertItemset.back() << endl;

TreeVertex * newTreeVert = new TreeVertex(newVertItemset);

cout << newTreeVert->getItemset().front() << " " << newTreeVert->getItemset().back() << endl;

for (list<int>::iterator it = newTreeVert->getItemset().begin(); it != newTreeVert->getItemset().end(); ++it) {
cout << (*it) << " ";
}

cout << endl;

cout << newTreeVert->getItemset().size() << endl;
return 0;
}

输出看起来像这样:

1 2

1 2

2

2

紧接着最后一个输出(第一个单曲“2”),应该和其他输出一样是“1 2”。

知道为什么迭代器不遍历第一个元素吗?

谢谢。

最佳答案

这个问题:

list<int>
TreeVertex::getItemset() {
return Itemset;
}

每次调用此函数时,它都会返回对象的拷贝,这意味着以下循环不应该工作:

for (list<int>::iterator it = newTreeVert->getItemset().begin(); 
it != newTreeVert->getItemset().end(); ++it) {

因为它比较来自两个不同对象的迭代器。一种解决方案是将引用 返回为:

list<int> &   //<--- return reference, not copy
TreeVertex::getItemset() {
return Itemset;
}

但更好的解决方案是完全删除 getItemset,而不是添加 begin()end() 成员函数,如下所示:

//define these typedefs first in the public section
typedef list<int>::iterator iterator;
typedef list<int>::const_iterator const_iterator;

iterator begin() { return itemSet.begin(); }
iterator end() { return itemSet.end(); }

然后将 for 循环写成:

for(TreeVertex::iterator it = newTreeVert->begin(); 
it != newTreeVert->end(); ++it) {

如果你可以使用 C++11,那么你应该添加这些:

//note : the function names start with `c`
const_iterator cbegin() const { return itemSet.cbegin(); }
const_iterator cend() const { return itemSet.cend(); }

或者,如果您使用 C++03(并且不能使用 C++11),则添加这些:

const_iterator begin() const { return itemSet.begin(); }
const_iterator end() const { return itemSet.end(); }

关于c++ - 列表迭代器不迭代所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com