c++ - 如何根据计数器缩放值

标签 c++ c++11

我有五个整数值

std::vector<int> vec(5, 0);

每个int的值将基于一个计数器。

如果counter为0,则所有int为0

如果计数器为100,则所有int的值为20

因此,当计数器为20时,第一个int的值为20,其余为0。

当计数器为30时,第一个int为20,第二个int为10

这是我的代码,我很想看看其他实现此目的的逻辑,
std::vector<int> vec(5, 0);
    int counter = 50;
    for (int i = 0; i < 5; i++)
    {
        int startValue = (i) * 20;
        int finalValue = counter - startValue;

        if (finalValue > 20)
            finalValue = 20;

        if (finalValue < 0)
            finalValue = 0;

        vec[i] = finalValue;
    }


    for (auto &v : vec)
    {
        std::cout << v << std::endl;
    }

最佳答案

我没有测试过,但是如果您正在寻找“聪明”的东西,请尝试以下操作:

int counter = 30;
for( int i = 0; i < 5; i++ ) {
    if( counter <= 20 * i ) {
        vec[i] = 0;
    } else {
        vec[i] = (counter > 20 * (1 + i)) ? 20 : counter % 20;      // how I think, or
        vec[i] = (counter - (20 * i) > 20) ? 20 : counter - 20 * i; // how you do it
    }
}

您可能可以对循环进行微优化,以用加法替换第二个乘法,但是您不可能比使用其循环展开选项的编译器更好地进行优化。

我不是StackOverflow的狂热用户(但是),但这个问题似乎最好将其发布在Code Review上(基于this answer on Meta)

关于c++ - 如何根据计数器缩放值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61537013/

相关文章:

c++ - 继承类与将类实例的 ptr 作为成员变量包含在内对性能有何影响?

c++ - 获取模板错误

c++ - 从类型列表到参数包

c++ - 将对类的引用转发为另一种类型

c++ - 对 std::multiset 中的相等范围进行排序

c++ - 如何使从科学计数法的转换更精确?

c++ - 如何使用线程每 0.3 秒发送一次消息?

c# - 如何修复 windbg 执行中显示的这个异常?

c++ - 我可以安全地使用#ifdef 来了解是否包含 c++ std header 吗?

c++ - BFS 路径 C++ 实现返回返回一个额外的值