用于循环数组的索引?

时间:2017-06-29 07:44:10

标签: c++ console histogram

我想使用最少量的for循环输出我的直方图

cout << "0|";
    for (int j = 0; j < bin[0]; j++)
        cout << "*";
    cout << endl;

目前我正在输出这样的直方图:

import os

myfile = open("ticker.csv", "r")
lines = myfile.readlines()

for line in lines:
        ticker = line.strip();
        cmd = "python get_quote_history.py --symbol=%s --from=2017-01-01 --to=2017-05-25 -o %s.csv"  %(ticker,ticker)
        os.system(cmd)

但这很漫长而烦人。有没有办法以更少的方式实现相同的输出  for loops?

2 个答案:

答案 0 :(得分:0)

我将忽略直方图代码中的错误,因为它与优化直方图输出的问题无关。 有关错误(返回本地变量)的信息,请查看this Stack Overflow question。 而且,你错过了大括号。在发布之前,请务必检查您的代码是否以最极简的形式编译并运行。

您声明问题在于您使用的方法“冗长而烦人”,但您不清楚是指代码的设计还是代码的执行速度。

性能

您可以读取直方图的最快速度是O(n),其中n是直方图中的区间数。从这个意义上说,你的代码可以在没有微观优化的情况下快速获得。

如果您的直方图中包含打印,那么您有O(n * m),其中m是每个bin的平均条目数。

写直方图也是O(n * k),其中k是数组中的条目数,因为你必须弄清楚每个值属于哪个bin。

设计

如果您遇到的问题是代码臃肿且难以处理,那么请使用较少的幻数并为函数添加更多参数,如下所示:

#include <iostream>

void histogram(int const size, int const * const arr, unsigned int const number_of_bins, float const bin_min, float const bin_max, int * output)
{
  float const binsize = (bin_max - bin_min)/number_of_bins;
  for (int i = 0; i < size; i++)
  {
    for(int j = 0; j < number_of_bins; ++j)
    {
      if (arr[i] >= bin_min + binsize*j && arr[i] < bin_min + binsize*(j+1))
      {
        output[j]++;
      }
    }
  }
}

int main(){
  int const number_of_bins = 10;
  float const bin_min = 0;
  float const bin_max = 100;
  int const size = 20;
  int const array[size] = {5,6,20,40,44,50,110,6,-1,51,55,56,20,50,60,80,81,0,32,3};
  int bin[number_of_bins] = {};
  histogram(size, array, number_of_bins, bin_min, bin_max, bin);
  for(int i = 0; i < number_of_bins; ++i)
  {
    std::cout << i << "|";
    for (int j = 0; j < bin[i]; j++)
    {
      std::cout << "*";
    }
    std::cout << std::endl;
  }
}

编译:

g++ main.cc -o Output

输出:

0|*****
1|
2|**
3|*
4|**
5|*****
6|*
7|
8|**
9|

(奖金,你的错误是固定的)

答案 1 :(得分:0)

首先你的程序是不正确的,因为正如所指出的那样,你从一个函数返回一个指向局部变量的指针。要解决此问题,您应使用std::array<Type, Size>std::vector<Type>

关于你的问题,如果你想要简短的代码,试试这个:

#include <string>
#include <algorithm>
#include <iostream>
#include <array>

std::array<int, 10> bin;

// Fill your array here

int i = 0;
std::for_each(bin.begin(), bin.end(), [&i](auto x) 
{ 
    std::cout << i++ << "|" << std::string(x, '*') << std::endl;
});

此代码利用std::string的填充构造函数来避免您的循环。但是,由于您想要遍历数组,您需要以某种方式执行此操作。通过显式或通过调用另一个函数。

注意:此代码的效率低于循环标准,但您的问题是如何避免这些。