Shi*_*bli 3 c++ algorithm vector c++11
在a中std::vector<unsigned int>
,我想找到元素的位置,该位置是小于某个数字的最大数.例如:
v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Run Code Online (Sandbox Code Playgroud)
我想找一个小于8的最大数字.这个数字是7.
以下代码不正确,但这可能是我想要的.
std::vector<unsigned int>::iterator pnt = std::find_if (v.begin(), v.end(), [](const unsigned int& x) { return x < 8; && x == MAX; });
Run Code Online (Sandbox Code Playgroud)
如果您的向量始终排序,那么您可以以对数复杂度进行排序
auto it = std::lower_bound(v.begin(), v.end(), 8); // first value >= 8
auto m = *((it != v.begin())? --it : it);
Run Code Online (Sandbox Code Playgroud)
如果您的矢量未分类但可以修改,则可以分两步完成:
auto it = std::partition(v.begin(), v.end(), [](int x) { x < 8 });
auto m = *(it != v.begin())? std::max_element(v.begin(), it) : it);
Run Code Online (Sandbox Code Playgroud)
如果您无法修改矢量,则可以手动完成
auto max = 0;
for (elem: v) {
if (elem < 8)
m = std::max(elem, m);
}
// m is now the max of all elements < 8
Run Code Online (Sandbox Code Playgroud)
两种最终方法都具有线性复杂性.后者可以通过使用一概而论filter_iterator从Boost.Iterator库,但那么你已经深入到模板的土地,所以只有这样做,如果你有反复需要这样的魔力.