【问题标题】:Difference between these two declaration of vector in C++ [closed]C ++中这两个向量声明之间的区别[关闭]
【发布时间】:2020-11-01 20:55:48
【问题描述】:

使用第一种方法声明向量显示一些与另一个不同的行为。 4 例如 - 如果以 第一种方式声明的向量包含 [1,1,2,1,3,3,2] 等数据 如果我们使用向量大小的方法为vectorname[1].size() this returns the number of occurrences of 1 in the vector and same for vectorname[2].size() or vectorname[3].size().

1.vector<int> data[size];//1st method[1][Contains VScode snap][1]

但是,使用第二种方法在VScode(版本1.50.1)中声明它给出的向量和错误,问题信息为-“表达式必须具有类类型

2.vector<int> data(size);//2nd method[2][Contains VScode snap][2]

[1]https://imgur.com/0RbrciK [2]https://imgur.com/5D9voNN

【问题讨论】:

  • 第一个创建了一个由size 空向量组成的数组。第二个使用 size 元素创建 一个 向量。
  • 第一种方法不声明向量,而是声明向量数组。至于为什么第二个变种不能编译提供minimal reproducible example
  • 如果有人可以提供帮助,请在不投反对票的情况下提供帮助。谢谢。
  • 目前除了你提出正确的问题,没有人能帮上忙,请不要投票
  • @Slava 感谢您的回答。它消除了我的大部分疑虑。抱歉,如果这不是一个合适的问题。我尝试搜索它,但没有找到任何合适的资源。如果您可以分享与此相关的有用信息,那就太好了。谢谢。

标签: c++ vector stl


【解决方案1】:

第一种方法没有声明单个vector,它声明了一个size数组,空vectors个数。第二种方法确实创建了一个带有size 零初始化整数的向量,它应该可以编译。从您给我们的内容中不清楚您收到错误的原因,但似乎可能是因为您的编译器无法识别vector 名称,因为您没有包含&lt;vector&gt; 或没有写@987654327 @ 在vector 之前。

【讨论】:

  • 第二种方法一定是编译器错误。很抱歉没有添加与之相关的整个图片,但我已经在上面添加了 using namespace std,因此无需在代码中再次添加 std::vector 或类似的东西。谢谢你的回答。
【解决方案2】:

至于你图片中的编译器错误(https://imgur.com/5D9voNN),你做的是:

vector<int> data(n + 1);
...
data->push_back(x);

请注意,data 不是指针。但是-&gt;箭头运算符)是通过指针调用方法的语法。
只需将行更改为

data.push_back(x);

(使用您的其他方法,它是有效的语法,因为您有一个向量数组,而data-&gt;push_back[x]; 在这种情况下会将 x 推回数组中的第一个向量。对于给定的上下文在语义上值得怀疑,但仍然有效语法。)

代码中的另一个错误是你后来有data[1].size()data[1] 是向量中的第二个元素,因此是整数类型。整数没有方法size()

(使用您的其他方法,这仍然是有效的语法,但由于第一个向量的长度为零,您也可以写成int ans = 0;。)

我看到的另外两个错误:

我假设最小值是为了取代向量中的值,而不是它们不存在的大小。如果是这样,那么您的代码假定 data[3] 存在。但是向量的长度是用户输入的,at 可能只有 1。在这种情况下,甚至 data[1] 都不存在,并且在运行时尝试访问这些元素时会出现分段错误。

其次,你首先创建一个长度为 n+1 的向量而不初始化值,然后你推回另一个 n 元素。之后,您的向量的长度将是 2n+1。这是有效的代码,但我坚信您想要一个长度为 n+1 的向量。如果是这样,您想使用data[i] = x; 而不是data.push_back(x);。或者,将向量创建为零长度向量,然后使用您的push_backs。 (不过,另一种方式更好。)

作为备注,在我看来,您想使用[i] 而不是[i-1] 访问向量的第i 个元素,并且出于这个原因,您使用n+1 作为向量长度而不是n。虽然这本身并没有错,但对于 C++ 来说却是不寻常的。
此外,在堆栈溢出时,不鼓励像您那样发布图片,至少没有充分的理由。直接将代码(和错误输出)作为文本发布。请注意,您在帖子中实际编写的向量初始化的单行完全没有问题,而您的错误发生在您没有写出的另一行并且只出现在图片中。总是发布整个代码(或者如果你有超过几行,创建一个MVCE)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2020-02-07
    • 2012-02-28
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多