理解向量初始化时出现问题

Problem with understanding a vector initialization

本文关键字:问题 初始化 向量      更新时间:2023-10-16

这可能是一个愚蠢的问题,但有些事情我不太明白。使用向量时,每当我想将元素"push_back"到某个位置时,只有以某种方式初始化向量,我才能这样做。

例如,当我使用此初始化时:

std::vector<int> Myvec;
int size = 0;
int x = 0;
std::cin >> size;
for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec[i].push_back(x);
}

我收到以下错误:请求在 'Myvec.std::vector<_Tp, _Alloc>::operator[] 中的成员 'push_back'>((std::vector::size_type(i((',它是非类类型 '__gnu_cxx::__alloc_traits>::value_type {aka int}'|

但是当我使用以下初始化时,它可以工作:

int size = 0;
int x = 0;
std::cin >> size;
std::vector<int> Myvec[size];
for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec[i].push_back(x);
}

使用它没有任何问题,并且可以在各种任务中实现它,但它困扰着我,因为我不确定它为什么实际有效。提前感谢您的帮助。

在第一个块中,您应该使用:

std::vector<int> Myvec;
int size = 0;
int x = 0;
std::cin >> size;
for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec.push_back(x);
}

或者您可以使用:

int size = 0;
int x = 0;
std::cin >> size;
std::vector<int> Myvec(size);
for(int i = 0; i < size; i++)
{
    cin>>Myvec[i];
}

并使用以下命令打印矢量:

for(int i = 0; i < size; i++) {
     std::cout<< Myvec[i]<<" ";
}
当你使用向量Myvec[size]

初始化它时,它变成了大小为"size"的向量向量,这意味着每个Myvec[i]都是一个可以在其中推送元素的向量。

在此处阅读更多内容: https://www.geeksforgeeks.org/2d-vector-in-cpp-with-user-defined-size/

你对std::vector::push_back函数的工作原理有误解。它基本上在向量的末尾附加一个新对象。特别是,您不需要使用 std::vector::operator[] 索引到向量中。相反,请将代码段更改为

for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec.push_back(x);
}

您提出的解决方案做了一些您可能不想要的事情,即使用原始向量数组:将用户输入传输到对象中时,它会创建size向量,每个向量都有一个元素。

你没有把一个元素放在向量中的位置i

您将一个元素放在向量数组中i向量的后面!更糟糕的是,数组是空的,因此访问无效。

但是,如果不是这样,您最终会得到i个向量,每个向量都有一个元素。不好!

相反,您可以使矢量具有一定的大小:

MyVec.resize(SomeSize);

然后分配元素,就好像向量是一个数组一样(它有点像(:

MyVec[i] = thing;

这里的关键点是你不必push_back;只有当你想把一个新元素推到向量的后面时,你才这样做。您可以使用类似数组的[]语法访问现有值。

在C++书中阅读有关向量的更多信息。