首页 > 解决方案 > std::min - 设计考虑

问题描述

我需要找到五个float值中的最小值,不包括任何零,以及它在顺序中的位置。

将要使用这段代码的数据量会很大,需要快速处理。这将在处理输入的服务器中24*7。最小值必须最终在数据库中更新。

在内存和时间使用方面,以下哪一项会更快,或者如果有任何其他更简单的方法,请告诉我。

  1. std::max精于tuple. 有四个元组值指示<value,location>.

    例子,

    std::tuple<float,int> f1 (10,1);
    
    bool less(float x, float y)
    { 
        if (x!=0 && x < y)
            return 0;
        else return 1;
    }
    
    tuple min (std::initializer_list<tuple> il, bool comp){
         what do I do here for initializer list?
    }
    
    int main () {  
      out << get<1>(min({f1,f2,f3,f4,f5},less));  
    }
    
  2. 使用std::min_element和重载上面的 less 运算符?使用迭代器 for 会不会是一种矫枉过正float

标签: c++c++14

解决方案


两个简单的选择是:

#include <utility>

std::pair<float, unsigned char> my_min(float *a) {
    float val = a[0];
    unsigned char pos = 0;
    for (unsigned char i = 0; i < 5; ++i) {
        if (a[i] != 0 && (a[i] < val || val == 0)) {
            val = a[i];
            pos = i;
        }
    }
    return {val, pos};
}

int main() {
    float a[5] = {1, 4, 0.5, 0, 5};

    return my_min(a).second;
}

#include <utility>

std::pair<float, unsigned char> my_min(float *a) {
    float val = a[0];
    unsigned char pos = 0;
    float *end = a + 5;
    for (float *ip = a; ip < end; ++ip) {
        float i = *ip;
        if (i != 0 && (i < val || val == 0)) {
            val = i;
            pos = ip - a;
        }
    }
    return {val, pos};
}

int main() {
    float a[5] = {1, 4, 0.5, 0, 5};

    return my_min(a).second;
}

推荐阅读