c++ - 迭代器根据用法 c++ 给出不同的结果
问题描述
我最近开始了 C++ 编程。我从 Java 转移。我正在构建自己的 Iterable 类模板,如下所示:
template<class T> class Iterable
{
T start,stop;
public:
explicit Iterable(T s,T e) {start=s; stop=e;;}
public:
virtual void next(T& i) =0;
public:
class iterator: public std::iterator<
std::input_iterator_tag, // iterator_category
T, // value_type
long, // difference_type
const T*, // pointer
T // reference
>{
T current;
Iterable<T>* obj;
public:
explicit iterator(T t,Iterable<T>* o) : obj(o) {current=t;}
iterator& operator++() {obj->next(current); return *this;}
iterator operator++(int) {iterator retval = *this; ++(*this); return retval;}
bool operator==(iterator other) const {return current == other.current;}
bool operator!=(iterator other) const {return !(*this == other);}
const T& operator*() const {return current;}
};
iterator begin() {return iterator(start,this);}
iterator end() {return iterator(stop,this);}
};
当我尝试使用这个迭代器时,当以不同的方式调用时,我得到了不同的结果:
for(auto S=SI.begin();S!=SI.end();S++)
{
cout << *S << "\n";
//cout << contains(seqs,S) << "\n";
if(!contains(seqs,*S))
seqs.push_back(*(new Sequence(*S)));
}
给出了不同的结果:
for(Sequence S : SI)
{
cout << S << "\n";
//cout << contains(seqs,S) << "\n";
if(!contains(seqs,S))
seqs.push_back(*(new Sequence(S)));
}
即使在循环中。我的 SeqIter 类(SI 是此类的对象)如下:
class SeqIter : public flex::Iterable<Sequence>
{
int n;
public:
SeqIter(int s) : Iterable(Sequence(copyList(0,s),s),Sequence(copyList(3,s),s)) {n=s;}
void next(Sequence& s)
{
char ch;
for(int i=0;i<n;i++)
{
ch=nextBase(s[i]);
s[i]=ch;
if(ch!=0)
break;
}
}
};
抱歉,如果代码太多,但我不知道需要多少代码。
另外,简单解释一下Sequence类:它是一个有一个数字数组的类(在这个例子中我尝试了3),它根据第一个生成下一个序列,即000、100、200、300;010,110 ...每个数字的范围从 0-3(都包括在内)我无法理解为什么两个循环都给出不同的序列(第一个给出 000 100 200 300 010 110 而第二个给出 000 100 200 300 000 110)我认为两个循环基本相同,第一个只是第二个的扩展。不是这样吗?
还有序列类:(抱歉耽搁了,但我想这是问题所在)
class Sequence
{
int size=1;
char* bps;
public:
Sequence() {size=0;}
Sequence(int s)
{
size=s;
bps=new char[s];
}
Sequence(char* arr,int s)
{
size=s;
bps=arr;
}
Sequence(const Sequence& seq)
{
size=seq.size;
bps=new char[size];
strcpy(bps,seq.bps);
}
String toString() const {return *(new String(bps,size));}
inline char* toCharArray() {return bps;}
inline int getSize() const {return size;}
//operator overloading
public:
bool operator==(const Sequence& s2) const
{
if(s2.size!=size)
return false;
String r1=toString();
String r2=s2.toString();
return (r1==r2 || r1==r2.reverse());
}
inline bool operator!=(const Sequence& s2) const {return !operator==(s2);}
const char& operator[](int n) const
{
if(n>=size)
throw commons::IndexOutOfBoundsException(n,size);
return bps[n];
}
char& operator[](int n)
{
if(n>=size)
throw commons::IndexOutOfBoundsException(n,size);
return bps[n];
}
Sequence& operator=(const Sequence& seq)
{
size=seq.size;
bps=new char[size];
strcpy(bps,seq.bps);
}
};
解决方案
对不起大家。调试后回答我自己的问题:在我的序列类中,我使用 strcpy 复制 char*,其中数组没有以 '\0' 结尾可能导致错误:我在网上阅读了更多内容,发现扩展如下:
for(Sequence S : seqs)
{
...
}
相当于
for(auto i=SI.begin();i!=SI.end();i++)
{
Sequence S=*i;
...
}
所以在作业中,(S=*i) 数据没有被正确复制。对不起,所有的烦恼
通过删除赋值运算符重载并将复制构造函数更改为:
Sequence(const Sequence& seq)
{
size=seq.size;
bps=new char[size];
for(int i=0;i<size;i++)
bps[i]=seq[i];
}
推荐阅读
- java - Java中线程失败的常见原因有哪些
- html - 将文本包裹在图像 CSS 上
- mysql - 通过 ODBC 在 SSRS 报告中调用带有参数的 MySQL 存储过程
- regex - 正则表达式确保四个字母之一只出现一次
- php - Artisan serve all functions 完美运行,但是当我在 Xampp 上运行它时,某些功能不起作用
- qt - 如何防止系列值缩放到 Qt 图表轴的 100% 范围?
- javascript - onChange 在 reactjs antd 中使用 setState 时返回一个回调
- apache - 如何用问号重定向链接
- android - 在后台Android中进行繁重处理时UI冻结
- reactjs - 使用来自反应应用程序的 axios 将数据传递给 Web 服务