Hôm nay tôi đã tự hỏi mình có thể là mã ngắn nhất có thể để có được tất cả giá trị trong một vector được sắp xếp std::vector<double>
, lớn hơn hoặc bằng a
và nhỏ hơn hoặc bằng b
.Cách ngắn nhất để có được danh sách con của danh sách giá trị được sắp xếp nằm trong khoảng thời gian nhất định
tiếp cận đầu tiên của tôi là một cái gì đó như sau:
#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
// Returns all values in sortedValues being greater equal start and smaller equal end;
std::vector<double> cutValues(const std::vector<double>& sortedValues, double start, double end) {
std::vector<double> ret;
auto startIter=std::lower_bound(sortedValues.begin(), sortedValues.end(), start);
auto stopIter = std::upper_bound(sortedValues.begin(), sortedValues.end(), end);
std::copy(startIter, stopIter, std::back_inserter(ret));
return ret;
}
int main(int argc, char **args) {
{
auto ret = cutValues({ 0.1,0.2,0.3 }, 0.1, 0.3);
std::copy(ret.begin(), ret.end(), std::ostream_iterator<double>(std::cout, ","));
std::cout << std::endl;
}
{
auto ret = cutValues({ 0.12,0.2,0.31 }, 0.1, 0.3);
std::copy(ret.begin(), ret.end(), std::ostream_iterator<double>(std::cout, ","));
std::cout << std::endl;
}
{
auto ret = cutValues({ 0.1,0.2,0.3 }, 0.2, 0.2);
std::copy(ret.begin(), ret.end(), std::ostream_iterator<double>(std::cout, ","));
std::cout << std::endl;
}
}
nghĩ thứ hai của tôi là một cái gì đó rất đơn giản như sau:
std::vector<double> cutValues2(const std::vector<double>& sortedValues, double start, double end) {
std::vector<double> ret;
std::copy_if(sortedValues.begin(), sortedValues.end(), std::back_inserter(ret), [&start, &end](auto v) { return v >= start && v <= end; });
return ret;
}
Nhưng xem xét trường hợp của chỉ loại bỏ các phần nhỏ từ một rất vector lớn nó có thể có một số vấn đề hiệu quả.
Bây giờ tôi tự hỏi bản thân mình, liệu có cách nào tốt hơn để làm điều đó không?
Lưu ý: Nếu bạn muốn mã của bạn hoạt động tương tự như các lớp thư viện chuẩn, tôi khuyên bạn nên thay đổi khoảng thời gian để bao gồm các giá trị lớn hơn hoặc bằng nhưng loại trừ các giá trị lớn hơn hoặc bằng b. Vì vậy, [a, b) hoặc [a, b [tùy thuộc vào cách bạn đã học để viết khoảng thời gian trong trường ;-). – muXXmit2X