今日、a
以上のソートされたベクトルstd::vector<double>
のすべての値を取得するための最短のコードと、 b
以下。特定の間隔内にある値のソートされたリストのサブリストを取得する最短方法
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;
}
しかし、唯一の非常に小さな部分を除去する場合を考える:私の第二の考えは以下のように非常にシンプルなものだった
#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;
}
}
:
私の最初のアプローチは、次のようなものでした大規模なベクトルそれはいくつかの効率の問題があるかもしれません。
今、もっと良い方法があるのかどうか、自分に尋ねています。
ちょっとした注意:標準のライブラリクラスと同じようにコードを動作させたい場合は、a以上の値を含むように間隔を変更することをお勧めしますが、b以上の値は除外してください。だから[a、b]または[a、b [あなたが学校でインターバルを書く方法を学ぶ方法によって、;-)。 – muXXmit2X