c++ - vector push_back零成空 vector

标签 c++ vector stl stdvector

我遇到了我不知道的std::vector的以下属性,我想知道是否有人可以为我澄清它。

我认为这段代码:

int main()
{
  int i = 5; 
  vector<int> vector;
  while(i > 0){
    vector.push_back(i);
    --i;
  }
}

应该产生一个包含以下元素的 vector :
5, 4, 3, 2, 1

但是,当我在上面运行代码时,得到的是:
5, 4, 3, 2, 0

为了探究正在发生的事情,我在每个阶段打印了 vector ,然后得到以下序列:
  • i = 5- vector (0)
  • i = 4-vector(5,0)
  • i = 3- vector (5,4,0)
  • i = 2- vector (5,4,3,0)
  • i = 1- vector (5,4,3,2,0)

  • 因此,我认为以某种方式在第一个周期(应该为5)中将一个push_backed归零,这很奇怪。如果尝试更大的值(例如n = 10),则每个时间周期都会修改最后一个元素。

    我不知道怎么回事。我的猜测是,缓冲区中可能有一些东西会在5点之前被推回,然后这会使推回和循环异相。或者是别的什么?

    编辑:

    因此,正如人们在注释中所指出或暗示的那样,该错误出在我使用的打印例程中。记录为:
    void print_vector(std::vector<int> vector){
      cout << string(10, '-') << endl;
      cout << "("; 
      for(int i=0; i < vector.size() - 1; ++i){
        cout << vector[i] << ", ";
      }
      cout << vector[vector.size()];
      cout << ")" << endl;
    
    }
    

    错误来自vector[vector.size()],当 vector 没有我猜到的元素时,它会做奇怪的事情。

    最佳答案

    是的,您的错误确实在打印代码中。的

    vector[vector.size()]
    

    在C++中,表达式是非法的。 vector 包含范围[0; vector.size()),表达式将尝试访问不存在的表达式。 vector 的最后一个元素,这是未定义的行为。

    关于c++ - vector push_back零成空 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614070/

    相关文章:

    c++ - 用 Armadillo 在 C++ 中定义全局矩阵变量

    c++ - Visual Studio 中 _WIN64 和 TARGET_X64 宏的具体区别

    c++ - 通过2个字段查找特定对象的 vector 元素

    c++ - 如何使用 scanf 获取指针大小的整数?

    c++ - 如何通过聚合访问对象的存储

    R:找到两个向量之间的交集

    vector - 是否可以直接修改词频/词向量?

    c++ - 根据一个 vector 中的值从两个 vector 中删除项目

    c++ - 如何从 VC6 中的范围构造 std::map

    c++ - 有没有办法限制 STL::map 容器的最大大小?