【问题标题】:std::min - design considerationstd::min - 设计考虑
【发布时间】:2019-07-28 00:23:22
【问题描述】:

我需要找到至少五个float 值(不包括任何零)及其在顺序中的位置。

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

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

  1. tuple 专门化std::max。有四个元组值 表示<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 运算符? 使用 float 的迭代器会不会有点矫枉过正?

【问题讨论】:

  • 要使用这段代码的数据量会很大 -- “巨大”是多少?当您说您只想要至少 5 个值时,您所说的“巨大”是什么意思?您想要大型数据集中 5 个值中的最小值吗?如果是这样的话,你XY-ing你的方法有这个问题。
  • 对不起,又编辑了我的帖子。
  • 还不清楚。忘掉你的方法吧——你会得到很多数据吗?当你读取这些数据(从文件、流等)时,你想知道最小的 5 个值是多少?
  • 所有值都为0的结果是什么?
  • 正如所写,这个问题不够精确,无法得到任何有意义的答案。

标签: c++ c++14


【解决方案1】:

两个简单的选择是:

#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;
}

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2011-06-20
    • 2014-08-23
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多