Trong nhận xét cho câu hỏi này is-there-a-way-to-iterate-over-at-most-n-elements-using-range-based-for-loop có thêm câu hỏi - điều này có thể có "chế độ xem chỉ mục" trên vùng chứa, tức là có sắp xếp lại với một số chỉ mục được lọc ra.Một cách để lọc phạm vi theo chỉ mục, để lấy min_element từ chỉ mục đã lọc?
Ngoài ra, tôi gặp phải sự cố khi tìm giá trị tối thiểu từ một phạm vi có một số chỉ mục được lọc ra.
I.e. là nó có thể thay thế mã như dưới đây với std và/hoặc các thuật toán tăng, các bộ lọc - để làm cho nó dễ đọc hơn và dễ bảo trì:
template <typename Range, typename IndexPredicate>
auto findMin(const Range& range, IndexPredicate ipred)
-> boost::optional<typename Range::value_type>
{
bool found = false;
typename Range::value_type minValue{};
for (std::size_t i = 0; i < range.size(); ++i)
{
if (not ipred(i))
continue;
if (not found)
{
minValue = range[i];
found = true;
}
else if (minValue > range[i])
{
minValue = range[i];
}
}
if (found)
{
return minValue;
}
else
{
return boost::none;
}
}
Chỉ cần để được sử dụng như thế này:
#include <iostream>
#include <vector>
int main() {
std::vector<float> ff = {1.2,-1.2,2.3,-2.3};
auto onlyEvenIndex = [](auto i){ return (i&1) == 0;};
auto minValue = findMin(ff, onlyEvenIndex);
std::cout << *minValue << std::endl;
}
Đây có phải là đề xuất cho C++ 17 không? Tôi có thể sử dụng nó trong gcc4.9 không? – PiotrNycz
Gcc 4.9 hoạt động ở chế độ C++ 11, sử dụng clang cho chế độ C++ 14 (gcc 5.1 có một số lỗi ngăn chế độ C++ 14). Đề xuất này đang đi đúng hướng cho C++ 17 hoặc TS, có thể cùng với C++ 17. Xem https://github.com/ericniebler/range-v3 – TemplateRex