c++ - What does v[a]++ mean? In this code, why are all v[a] values 1?
问题描述
In the following code, what is the meaning of v[a]++
? Why is it that after the loop has completed, all v[a]
have value 1
?
int n , i , a ; cin>>n;
vector<int> v(n+1) , index(n+1);
for(i=0;i<n;i++){
cin>>a ;
v[a]++ ;
index[a]=i+1;
}
Is there any alternative of writing this code, using STL containers such as std::map
?
解决方案
是什么v[a]++
意思?
这基本上意味着a
向量的第 th 值v
加一。因此,例如,如果a
is13
和v[13]
is 17
,那么v[a]++
将导致v[13]
be 18
。
v[a]++
和之间有一些更精细的区别++v[a]
,您可以在此处阅读。
为什么都是v[a]
价值观1
?
该线vector<int> v(n+1)
创建一个大小为 的向量n+1
。这个向量是零初始化的,这意味着它保持n+1
零。因此,当您使用 and 运行一些时v[a]++
,这将增加从to 。a
0 <= a
a < n+1
v[a]
0
1
因此a
,对于用户输入的每一个,如果a
是这样,0 <= a
并且a < n+1
,并且 noa
重复两次,那么每个v[a]
都将从0
增加到1
。如果 ana
被重复两次,那么这将v[a]
首先从0
to增加1
,然后从1
to增加2
。
请注意,由于循环仅进行n
迭代,但向量具有n+1
条目,因此并非所有元素都可以增加。因此,即使用户为 each 输入不同的值a
,这仍然会留下一个未增加的条目。
这可以做到std::map
吗?
你还没有具体说明你想要做什么。我对您的代码的理解是,您想计算v
用户输入数字的次数(即某种直方图),并且index
您想跟踪用户上次输入数字的时间。
当然,有许多不同的方法可以做到这一点。如果n
变得非常大并且您知道用户不会输入范围内的大多数数字,则使用 a0
可能不会节省空间,因为很多条目将永远不会被使用。在这种情况下,使用地图会更节省空间。要使用 a 计算出现次数,您可以使用:n
std::vector
std::map
#include <iostream>
#include <map>
#include <vector>
int main() {
int n;
std::cin >> n;
std::map<int, int> occurrences{};
for (int i = 0; i < n; i++) {
int a;
std::cin >> a;
occurrences[a]++;
}
for (auto [key, value] : occurrences) {
std::cout << key << " -> " << value << std::endl;
}
}
关于index
,这取决于你想用这些数据做什么。
如果您真的只想跟踪用户上次输入数字的时间,您可以使用与示例中所示相同的方法,例如通过添加第二个映射a
到其索引的映射,或者您可以将两个映射合并为一个std::map<int,std::pair<int,int>>
映射a
到一对保存出现次数a
及其索引的类型。
如果您有不同的用例(例如,可以访问输入数字的所有索引,而不仅仅是最后一个索引),则必须指定这一点并提供更多详细信息。
推荐阅读
- javascript - WebShare Api 共享文件?
- c++ - 为什么我的程序会出错(文件处理)?
- node.js - Angular + Expressjs Http失败响应未知错误0
- python - Python中的高精度词对齐算法
- c++ - 为什么对“getNoise”的调用使用基类实现而不是子类实现?
- python - Openpose 在低分辨率图像上?
- typescript - Mongoose 和 Typescript 模型需求函数
- time-complexity - 通过位长度确定程序的执行时间?
- python - 如何使用 Selenium 按类定位剑道按钮
- javascript - 为数字而不是字符串工作的对象的顺序数组