私は2 const_iteratorsを作成スパース行列の私の実装をテストするためにmain.cppにやってる:奇妙なconst_iteratorの行動
SparseMatrix<double>::const_iterator a,b;
a=mata.begin(); //mata previously created as SparseMatrix<double>
b=mata.end();
... //code goes on
問題は、それは始まりと終わり(それを呼び出していないということです最初のcoutはしません)、2つのイテレーターを作成すると動作します。 const_iteratorsのbeginとendを実装した方法は次のとおりです。
const_iterator begin() const
{
cout<<"Begin"<<endl;
int minr=minRow();
int minc=minCol(findRow(minr));
mcol * mc=findCol(findRow(minr),minc);
const_iterator x;
if(mc!=NULL)
{
T* dato=&(mc->data);
x= const_iterator(genElement(minr,minc,dato));
}
else
{
x=const_iterator(NULL);
}
x.setSM(const_cast<SparseMatrix<T>*>(this));
return x;
}
const_iterator end() const
{
cout<<"End"<<endl;
const_iterator x= const_iterator(NULL);
x.setSM(const_cast<SparseMatrix<T>*>(this));
return x;
}
私は気づいた奇妙なことは、私は疎行列のクラスメソッド内の2 const_iteratorsを作成した場合、彼らが働くということです。あなたが言うように
作成されていないことをどのように知っていますか?ほとんどの場合、コンパイラは使用されていないため、それらを最適化しました。 –
begin()とend()で何も割り当てられていないので、const_iterator演算子++()は割り当てられていないメモリ領域を読み込もうとしています。 – Vektor88
私は、投稿したコードに明らかに間違ったものがあるのを見てください:問題を示す最小限の、完全にコンパイル可能なプログラムを表示できますか? –