v[a]++ 是什么意思?在这段代码中,为什么 v[a] 的值都是 1?

问题描述

在下面的代码中,v[a]++是什么意思?为什么循环完成后,所有v[a]的值都是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;
     }

是否可以使用 STL 容器(例如 std::map)编写此代码

解决方法

v[a]++ 是什么意思?

这基本上意味着向量 a 的第 v 个值加一。因此,例如,如果 a13,而 v[13]17,则 v[a]++ 将导致 v[13]18 .

v[a]++++v[a] 之间有一些更细微的区别,您可以阅读有关 here 的内容。

为什么所有的 v[a] 值都是 1

vector<int> v(n+1) 创建一个大小为 n+1 的向量。这个向量是零初始化的,这意味着它包含 n+1 零。因此,当您使用 v[a]++a 为某个 0 <= a 运行 a < n+1 时,这会将 v[a]0 增加到 {{1} }.

所以对于用户输入的每一个 1,如果 a 是这样的 a0 <= a,并且没有 a < n+1 重复两次,那么每个a 将从 v[a] 增加到 0。如果 1 重复,例如两次,那么这将首先将 av[a] 增加到 0,然后从 1 增加到 1

请注意,因为循环只进行 2 次迭代,但向量有 n 项,因此并非所有元素都可以增加。因此,即使用户为每个 n+1 输入不同的值,这仍然会留下一个未增加的条目。

这可以用 a 完成吗?

您还没有具体说明您想要做什么。我对您的代码的理解是,您希望在 std::map 中计算用户输入数字的次数(即某种 histogram),并在 v 中进行跟踪用户最后一次输入号码。

当然有很多不同的方法可以做到这一点。如果 index 变得非常大,并且您知道用户不会输入 n0 范围内的大多数数字,则使用 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>> 映射到包含 {{1} 出现次数的一对}} 及其索引。

如果您有不同的用例(例如,可以访问输入数字的所有索引,而不仅仅是最后一个索引),您必须指定这一点并提供更多详细信息。