我想指出,我是编程新手,真的很难弄清楚用户输入几个元素并将所有这些元素推到向量上并递增的模式。
int n, count = 0;
std::cin >> n;
std::vector<int> vec(n);
for (size_t i = 0; i < n; i++)
{
int x;
std::cin >> x;
vec[x]++;
std::cout << vec[i] << std::endl;
}
对于6个(n)
元素的样本输入: 1 2 2 3 1 2
向量包含: 0 1 2 1 0 0
如果有人对此有所了解,将会有很大的帮助。
预先感谢
答案 0 :(得分:1)
让我们逐步进行:
int n;std::cin>>n;
输入向量大小的值。
std::vector<int> vec(n);
使用n
个元素创建矢量,所有默认初始化,对于int
值,它们表示它们将为零。
如果您现在和我在一起,那么其余的应该很容易...
如果我们跳过循环:
int x; std::cin>>x;
vec[x]++;
将值读入x
,使用该值作为向量的索引,并增加该索引处的值。
因此,如果x
的输入为1
,则相当于vec[1]++
,即第二个(记住索引是基于 0的)加一。如果vec[1]
为零(以上为默认值),则它将变为1
。
通过循环和输入1 2 2 3 1 2
,索引1
将增加两次,索引2
将增加三次,索引3
将增加一次。它应该为您提供输出0 2 3 1 0 0
(作为show here)。
答案 1 :(得分:0)
您最后看不到“向量包含的内容”。您碰巧看到循环期间向量包含的值,但是不同的输入将给出的输出永远都不是向量的内容。
为演示,我们可以在循环的每次迭代中打印整个向量,然后得到类似
的输出0 1 0 0 0 0
0 1 1 0 0 0
0 1 2 0 0 0
0 1 2 1 0 0
0 2 2 1 0 0
0 2 3 1 0 0
粗体部分形成您的输出。请注意,较早的术语在打印后如何更新
#include <iostream>
#include <vector>
std::ostream& operator<<(std::ostream& os, const std::vector<int>& vec)
{
for (auto& el : vec)
{
os << el << ' ';
}
return os;
}
int main()
{
int n;std::cin>>n;
std::vector<int> vec(n);
for(size_t i=0;i<n;i++)
{
int x; std::cin>>x;
vec[x]++;
std::cout << vec << std::endl;
}
}
您看不到向量的任何状态的输入示例是
1 2 2 3 1 5
您的输出将是
0 1 2 1 0 1
哪个都不匹配中间值
0 1 0 0 0 0
0 1 1 0 0 0
0 1 2 0 0 0
0 1 2 1 0 0
0 2 2 1 0 0
0 2 2 1 0 1
答案 2 :(得分:0)
换句话说
int x;
std::cin >> x;
vec[x]++;
您将把整数的最高频率存储在数组中,并使用它作为索引并递增数组。
答案 3 :(得分:-1)
您可能想做的就是更改此内容:
vec[x]++;
对此:
vec[i] = x;
该数组的索引位于i
中,并且递增该索引已经在for
循环中发生(该循环正确地从第一个元素0到最后一个元素,元素n-1。)
您必须注意,x
不是任何内容的索引;它是用户要放入向量元素i
中的值,反映在语句vec[i] = x;
中。
您编写的内容将导致这种情况的发生:首先,您将创建一个包含n
个元素的向量,这些元素都已初始化为0。这只是std::vector<int> vec (n);
的结果。
此后,关键声明为vec[x]++;
。这就是说,对于x
,请将其视为数组的索引,并一次增加元素x
的值。如果有效,这将计算输入中的零,一,二等。因此,您得到的结果(0,1,2,1,0,0)表示您的数字列表中有0个0、1个1、2个2、1个3、0个4和0个5。
如果您输入的数字大于(甚至等于)n
,您会怎么办? (提示:这就是程序员所说的“越界访问”。)