我正在爲我的一位論文的教授質譜數據庫工作。這也是我的第一篇文章,雖然網站一直非常有幫助。奇怪的錯誤與std :: lower_bound
我正在使用GNU CPP 4.8旗子以下錯誤:
CXX = g++
BOOSTDIR = /home/user/boost_1_60_0/ #Uses boost_1_60_0 lirary.
CXXFLAGS = -std=c++11 -g -ggdb -rdynamic -D_GLIBCXX_DEBUG -Wall -Wextra -I$(BOOSTDIR)
LDFLAGS = -L/home/user/boost_1_60_0/stage/lib -lboost_system -lboost_filesystem -lboost_iostreams
導致此:
/usr/include/c++/4.8/bits/stl_algo.h:2438:error: elements in iterator range
[__first, __last) are not partitioned by the predicate __comp and value
__val.
Objects involved in the operation:
iterator "__first" @ 0x0x7ffd8a308c30 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIP11cache_tableNSt9__cxx19986vectorIS3_SaIS3_EEEEENSt7__debug6vectorIS3_S7_EEEE (mutable iterator);
state = dereferenceable (start-of-sequence);
references sequence with type `NSt7__debug6vectorI11cache_tableSaIS1_EEE' @ 0x0x7ffd8a308c30
}
iterator "__last" @ 0x0x7ffd8a308c60 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIP11cache_tableNSt9__cxx19986vectorIS3_SaIS3_EEEEENSt7__debug6vectorIS3_S7_EEEE (mutable iterator);
state = past-the-end;
references sequence with type `NSt7__debug6vectorI11cache_tableSaIS1_EEE' @ 0x0x7ffd8a308c60
}
Aborted (core dumped)
這裏是有關方法調用:
void db::get_range(double mz_min, double mz_max, double rt_min, double rt_max, std::vector<dp> & ilist){
//Get valid rt ranges. //OPTIMIZE
auto rt_low = std::lower_bound(tlist.begin(), tlist.end(), rt_min, rt_less_than());
//Iterate from low end until out of range or end of list.
for(auto a = rt_low; (a != tlist.end() && (*(*a).begin()).rt_max < rt_max); a++){
//Get valid mz ranges. //OPTIMIZE
auto mz_low = std::lower_bound((*a).begin(), (*a).end(), mz_min, mz_less_than()); //This call is what is throwing the error.
for(auto b = mz_low; (b != (*a).end() && (*(*a).rbegin()).mz_max < mz_max); b++){
std::clock_t access_time = std::clock();
(*b).get(mz_min, mz_max, rt_min, rt_max, ilist, access_time);
tqueue.push(std::make_pair(&(*b), access_time));
trim();
}
}
}
以下是一些支持代碼:
//Comparator to check rt ranges.
struct rt_less_than{
bool operator()(std::vector<cache_table> & p, double s) const{
return p[0].rt_max < s;
}
bool operator()(double p, std::vector<cache_table> & s) const{
return p < s[0].rt_max;
}
};
//Comparator to check mz ranges.
struct mz_less_than{
bool operator()(cache_table & p, double s) const{
return p.mz_max < s;
}
bool operator()(double p, cache_table & s) const{
return p < s.mz_max;
}
};
現在這整件事情一直工作,直到我不得不重構大部分代碼。我不是cpp最有經驗的人,這個錯誤聽起來好像我沒有滿足函數的一些模板要求,但是當我在mz_lower_than()對象中檢查類名時,它看起來沒問題。在對mz_lower_than()的調用中檢查發現,在對此測試集大小爲99的矢量進行大約90次調用之後,它將引發錯誤。
谷歌搜索這個錯誤已經發現,其他幾個人都看到了,但第3頁之後,似乎沒有人真正有了答案。我覺得它是一個非常簡單的東西引起的奇怪的錯誤,但我似乎無法弄清楚它會是什麼。
程序是非常大的,所以我只貼了似乎是代碼給你發生了什麼事的想法所需的最低量。如果需要,我當然可以粘貼更多的代碼。
任何人都可以幫助我嗎? 謝謝!
這聽起來像按照'std :: lower_bound'的要求,要分區的數組不是嚴格的弱順序。 –
出示您的[MCVE]。 MCVE不僅僅是「最小」,也是「完整」的。如果你還沒有,那麼你還沒有完成調試!山姆可能是對的;那些比較者對我來說看起來頗爲懷疑。 –
好的感謝您的意見。我會用std :: sort()來檢查是否是錯誤。 – mWellington