我有一个小项目。我想制作这样的频率图:
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 中的 vector ?
因为我不知何故做不到 keyAndMap.insert(std::make_pair<int,std::vector<int>>(bAxis,bVec.push_back(bValue)));
我认为主要的问题是如何为 std::map 中的每个键生成唯一的 vector ?
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)));
}
虽然如果我以某种方式通过那条线,我这里的逻辑是有缺陷的,因为 vector 不是每个键唯一的。 我绘制的漂亮小图中的每个“x”都是通过循环中的每次传递获得的。 所以对于每个 b 轴(2、4、6、7 和 9)应该在它们自己的 std::vector 中
最佳答案
What container should I use and how do go about implementing that in the simplest way?
可能的容器是 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*
}
To access the
data
you could use iterators, like so:
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
的索引,但是,您应该知道数据的范围**,以便可以将其用作初始 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
,因此您可以简单地使用键来访问和递增元素。
**范围 - 最低值和最高值之间的差异。
关于c++ - 我应该为频率图选择什么 C++ 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42961345/