gpt4 book ai didi

c++ - std::lower_bound 的奇怪错误

转载 作者:行者123 更新时间:2023-11-28 02:01:29 28 4
gpt4 key购买 nike

我正在为我的一位教授的一篇论文开发质谱数据库。这也是我在这里的第一篇文章,尽管该网站非常有帮助。

我在使用带有标志的 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 的 vector 进行大约 90 次调用后抛出错误。

谷歌搜索这个错误发现其他一些人已经看到它但是在前 3 页之后似乎没有人真正得到答案。我感觉这是一个由非常简单的事情引起的奇异错误,但我似乎无法弄清楚它会是什么。

该程序非常大,所以我只粘贴了似乎是让您了解正在发生的事情所需的最少代码。如果需要,我当然可以粘贴更多代码。

有人可以帮我吗?谢谢!

最佳答案

您只能在按比较仿函数中使用的相同标准排序的序列上运行 lower_bound。由于您没有在代码中显示任何 sort,我必须假设您的数据未排序。

关于c++ - std::lower_bound 的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39360039/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com