我需要編寫一些類來在我的代碼中實現無上下文文法。 CFG具有格式「左側 - >右側」的生產規則。他們實現如下:爲什麼我的迭代器指向null,但只是有時?
class GrammarProduction{
public:
Nonterminal mLhs;
std::vector<GrammarSymbol*> mRhs;
我想將我的生產規則存儲在一個std :: set,以確保沒有人可以添加重複的規則。 爲了進行重複檢測工作,我爲語法生成實現了運算符<,如下所示。
bool GrammarProduction::operator<(const GrammarProduction& other) const{
if (mLhs < other.Lhs()) return true;
if (mRhs.size() < other.Rhs().size()) return true;
std::vector<GrammarSymbol*>::const_iterator it1, it2;
it2 = other.Rhs().begin();
for(it1 = mRhs.begin(); it1 != mRhs.end(); it1++){
std::cout << (*it1) << std::endl;
std::cout << (*it2) << std::endl;
if(**it1 < **it2) return true;
it2++;
}
return false;
}
運行這段代碼讓我在行
if(**it1 < **it2) return true;
因爲指針* IT2是空分割故障。但是,如果我將打印* it2的行更改爲
std::cout << (*it2) << other.Str() << std::endl;
它工作得很好,* it2不爲空。我不知道這是爲什麼,任何意見將不勝感激。 如果需要發佈被調用的函數,我會這樣做。我沒有,因爲我希望這個問題不重要,它會是一個相當大的數量(至少對於一個職位而言)。
編輯:我已經縮小的問題,並把它歸結爲這個
bool GrammarProduction::operator<(const GrammarProduction& other) const{
std::vector<GrammarSymbol*>::const_iterator it1, it2;
it1 = mRhs.begin();
std::cout << "it1:" << std::endl;
std::cout << (*(mRhs.begin()))->Str() << std::endl; //output (1,2,2)
std::cout << (*it1)->Str() << std::endl; //output (1,2,2)
it2 = other.Rhs().begin();
std::cout << "it2:" << std::endl;
std::cout << (*(other.Rhs().begin()))->Str() << std::endl; //output (1,2,2)
std::cout << (*it2)->Str() << std::endl; //Segmentation Fault
//do whatever
return false;
}
提示:您可能想檢查'it2 == other.Rhs()。end()'。 – Xeo
打我吧@Xeo。您可能會繼續超過其他大小.Rhs –
不,這並不能解釋如何打印other.Str()會解決此問題。迭代器不能溢出,因爲「if(mRhs.size()
Shal