【发布时间】:2018-06-10 23:48:02
【问题描述】:
现在,我正在尝试创建一个模板类 Set,它包含一个带有迭代器的泛型类型 <T>。虽然我不太明白目的是什么,但我应该为迭代器创建所谓的“结束哨兵”:
while(start != end)
cout << start++ << endl;
start 和 end 指的是我认为是向量的开始和结束。到目前为止,我已经创建了一个模板类,并在其中创建了一个迭代器。在我的主目录中,我插入 10 个整数,然后尝试使用我的“结束哨兵”。我的代码如下所示:
#include <iostream>
#include <vector>
using namespace std;
template <class T>
class Set{
vector<T> theSet;
public:
Set() {}
Set(const Set& s): theSet(s.theSet){}
~Set(){theSet.clear();}
void insert(T t){
cout << "inserted " << t << endl;
theSet.push_back(t);
}
class iterator;
friend class iterator;
class iterator{
Set<T>& s;
int index;
public:
iterator(Set<T>& is) : s(is), index(0) {}
iterator(Set<T>& is, bool) : s(is) {}
T operator*(){
return s.theSet.at(index);
}
T operator++(){
return ++s.theSet.at(index);
}
T operator++(int){
return s.theSet.at(index)++;
}
bool operator!=(const iterator& ri)const {return index!=ri.index;}
};
iterator begin() {return iterator (*this);}
//Create the end sentinel:
iterator end() {return iterator (*this, true); }
};
int main()
{
Set<int> other;
for(int i=0; i<10; ++i){
other.insert(i);
}
/*
for(Set<int>::iterator start = other.begin(); start != other.end(); start++){
cout << *start << endl;
}
cout << "\n\n Program ends succesfully" << endl;
*/
Set<int>::iterator start = other.begin();
Set<int>::iterator end = other.end();
while(start != end){
cout << start++ << endl;
}
return 0;
}
当我在课堂结束时引用start 和end 时,问题就来了:
iterator begin() {return iterator (*this);}
//Create the end sentinel:
iterator end() {return iterator (*this, true); }
看来,begin() 使用第一个构造函数返回 iterator,end() 使用第二个构造函数返回 iterator,因为后者接受两个参数。然而,我得到的第二个构造函数看起来像
iterator(Set<T>& is, bool) : s(is) {}
我不确定这如何引用容器的“末端”。如何正确引用?
【问题讨论】:
-
第二个 c'tor 实际上给
index留下了一个不确定的值。这完全是错误的。 -
好的,我想你在提到容器
iterator(Set<T>& is, bool) : s(is) {}时是这个意思。我还是新手,我只是假设它只是构造函数。我将其更改为iterator(Set<T>& is, bool) : s(is), index(9) {}。但是,我需要找到一种方法来始终引用最后一个元素。所以我想,我可以创建一个单独的int来跟踪它? -
或者利用索引永远不会为负的事实。所以像
-1这样的东西可能是一个全局的“结束”。
标签: c++ vector iterator containers