我应该为频率图选择什么C ++容器?

时间:2017-03-22 19:48:38

标签: c++ containers frequency

我有一个小项目。我想制作一个像这样的频率图:

a-axis
3|    x
2|`   x        x
1|    x  x     x
0| x  x  x     x
 |`_____________`
   2  4  6  7  9  b-axis

我应该使用什么容器以及如何以最简单的方式实现它。

  • 容器还应记录零值(频率)。

我发现很难纠正实施容器。我可以查看一些示例代码吗?或者任何人都可以为我写一个样本来学习。

更新: 我在想std::map<int,std::vector<int>> keyAndMap 如何访问keyAndMap内的向量? 因为我不知道怎么做keyAndMap.insert(std::make_pair<int,std::vector<int>>(bAxis,bVec.push_back(bValue))); 我认为的主要问题是如何为std :: map中的每个键生成唯一向量?

const int tries = 21;
std::vector<int>values;
std::map<int,std::vector<int>>keyAndMap;
for (int i = 1; i < tries; i++)
{
    int n = i;
    int cycle = calculate(n);
    /*This next line is an error... why?*/
    keyAndMap.insert(std::make_pair<int,std::vector<int>>(cycle,values.push_back(i)));
}

虽然如果我以某种方式通过该行,我的逻辑存在缺陷,因为向量并非每个键都是唯一的。 我绘制的小漂亮图中的每个'x'都是在循环中的每次传递中获得的。 因此对于每个b轴(2,4,6,7和9)应该在它们自己的std :: vector

1 个答案:

答案 0 :(得分:2)

  

我应该使用什么容器以及如何以最简单的方式实现它?

一个可能的容器是std::map<key, frequency>,两者都是int类型,还有一个额外的好处是你的值被排序。然后你可以通过以下方式读取值:

std::map<int, int> data;

int key;
while (std::cin >> key)
{
    ++data[key]; // increment the frequency of a given key*
}
  

要访问data,您可以使用迭代器,如下所示:

for (auto it = data.begin; it != data.end(); ++it)
{
    // iterator to key  
    std::cout << it->first <<": "<< it->second <<"\n";
                              // iterator to frequency
}

将打印数据的两列表格。

其次,更简单的方法:

您可以使用std::vector<frequency>,其中frequency的类型为int,您的数据将是std::vector的索引,然而,您应该知道数据的范围** ,以便将其用作初始矢量大小: 即std::vector<int> data(5, 0)可以保存范围 5的值。

然后,例如,如果您的数据由整数组成:[0,4],您可以:

std::vector<int> data(5, 0); // five elements with initial value 0

int key;
while(std::cin >> key)  // assuming key >= 0 && key < 5
{
    data[key] += 1;  
} 

然后打印:

for (int i= 0; i < data.size(); ++i)
{
    std::cout << i <<": "<< data[i] <<"\n";
}

*不同frequency的默认初始key值为:0,因此您只需使用该键即可访问和增加元素。

**范围 - 最低值和最高值之间的差异。