我有一个小项目。我想制作一个像这样的频率图:
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
中答案 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
,因此您只需使用该键即可访问和增加元素。
**范围 - 最低值和最高值之间的差异。