问题描述
在下面的代码中,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
个值加一。因此,例如,如果 a
为 13
,而 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
是这样的 a
和 0 <= a
,并且没有 a < n+1
重复两次,那么每个a
将从 v[a]
增加到 0
。如果 1
重复,例如两次,那么这将首先将 a
从 v[a]
增加到 0
,然后从 1
增加到 1
。
请注意,因为循环只进行 2
次迭代,但向量有 n
项,因此并非所有元素都可以增加。因此,即使用户为每个 n+1
输入不同的值,这仍然会留下一个未增加的条目。
这可以用 a
完成吗?
您还没有具体说明您想要做什么。我对您的代码的理解是,您希望在 std::map
中计算用户输入数字的次数(即某种 histogram),并在 v
中进行跟踪用户最后一次输入号码。
当然有很多不同的方法可以做到这一点。如果 index
变得非常大,并且您知道用户不会输入 n
到 0
范围内的大多数数字,则使用 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} 出现次数的一对}} 及其索引。
如果您有不同的用例(例如,可以访问输入数字的所有索引,而不仅仅是最后一个索引),您必须指定这一点并提供更多详细信息。