【问题标题】:Problem with understanding a vector initialization理解向量初始化的问题
【发布时间】:2019-05-31 10:01:57
【问题描述】:

这可能是一个愚蠢的问题,但有些东西我不太明白。使用向量时,每当我想将一个元素“推回”到某个位置时,只有以某种方式初始化向量时,我才能做到这一点。

例如当我使用这个初始化时:

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[] >(((std::vector::size_type)i))'中的成员'push_back',它是非类类型'__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);
}

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

【问题讨论】:

  • 使用MyVec.push_back(x) 代替MyVec[i].push_back(x)MyVec[i] 是(引用)int,因此没有 push_back() 操作。

标签: c++ vector


【解决方案1】:

在你应该使用的第一个块中:

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/

【讨论】:

    【解决方案2】:

    您对std::vector::push_back 函数的工作方式存在误解。它基本上在向量的末尾附加了一个新对象。特别是,您不需要使用std::vector::operator[] 对向量进行索引。相反,将您的 sn-p 更改为

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

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

    【讨论】:

    • 那么在哪些情况下使用“Myvec[i].push_back(x)”语法更有用?
    • 取决于您要执行的操作。 Myvec[i].push_back(x) 仅在您想用用户输入填充二维结构时才有用。
    • 实际上,当我尝试实现例如图形时,我会使用这种语法,并且我想在某个位置添加一个元素以查找它们之间的邻接关系。
    • MyVec[i].push_back(x) 只有在MyVec[i] 是支持push_back() 成员函数的东西(例如,像std::vector 这样的标准容器)时才有意义。在您的示例中,MyVec[i]int,因此没有这样的成员函数。
    【解决方案3】:

    您没有将元素放在位置 i 的向量中。

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

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

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

    MyVec.resize(SomeSize);
    

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

    MyVec[i] = thing;
    

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

    在您的 C++ 书籍中了解有关向量的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2011-02-08
      • 2021-10-05
      • 2011-03-04
      • 2011-05-18
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多