首页 > 解决方案 > 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?

标签: c++vectorinput

解决方案


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

这基本上意味着a向量的第 th 值v加一。因此,例如,如果ais13v[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 。a0 <= aa < n+1v[a]01

因此a,对于用户输入的每一个,如果a是这样,0 <= a并且a < n+1,并且 noa重复两次,那么每个v[a]都将从0增加到1。如果 ana被重复两次,那么这将v[a]首先从0to增加1,然后从1to增加2

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

这可以做到std::map吗?

你还没有具体说明你想要做什么。我对您的代码的理解是,您想计算v用户输入数字的次数(即某种直方图),并且index您想跟踪用户上次输入数字的时间。

当然,有许多不同的方法可以做到这一点。如果n变得非常大并且您知道用户不会输入范围内的大多数数字,则使用 a0可能不会节省空间,因为很多条目将永远不会被使用。在这种情况下,使用地图会更节省空间。要使用 a 计算出现次数,您可以使用:nstd::vectorstd::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及其索引的类型。

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


推荐阅读