在 C++ 中的向量中使用 push_back vs at

bad*_*dri 0 c++ c++11

对在 C++ 中使用向量有疑问。它与向量中的 push_back 方法有关。对于第一个程序,我使用 push_back 将元素插入到向量中。对于第二个程序,我使用 at() 将元素插入到向量中。

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main ()
{
  std::vector<string> myvector (3);

  cout << "In main" << endl;
  for (unsigned i=0; i<myvector.size(); i++)
  {
    myvector.push_back("hi");  //Note: using push_back here.
  }
  cout << "elements inserted into myvector" << endl;

  std::cout << "myvector contains:" << endl;
  for (auto v: myvector)
     cout << v << endl;

  // access 2nd element
  cout << "second element is " << myvector[1] << endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)
Output:    
Hangs after entering main.    
$ ./a.out    
In main
Run Code Online (Sandbox Code Playgroud)

而如果我使用 myvector.at() 插入如下元素,则很好。

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main ()
{
  std::vector<string> myvector (3);

  cout << "In main" << endl;
  for (unsigned i=0; i<myvector.size(); i++)
  {
    myvector.at(i) = "hi";  // using 'at' instead of 'push_back'
  }
  cout << "elements inserted into myvector" << endl;

  std::cout << "myvector contains:" << endl;
  for (auto v: myvector)
     cout << v << endl;

  // access 2nd element
  cout << "second element is " << myvector[1] << endl;

  return 0;
}

Run Code Online (Sandbox Code Playgroud)
Output:
./a.out
In main
elements inserted into myvector
myvector contains:
hi
hi
hi
second element is hi
$
Run Code Online (Sandbox Code Playgroud)

我使用 push_back 的方式有什么问题?这是我们向向量中插入元素的方式之一,对吧。

cig*_*ien 7

这个循环中的问题:

for (unsigned i=0; i<myvector.size(); i++)
{
    myvector.push_back("hi");  //Note: using push_back here.
}
Run Code Online (Sandbox Code Playgroud)

是如果你曾经进入循环,即myvector最初不是空的,那么每个push_back都会增加向量的大小。由于i在循环中每次递增一次,它永远不会赶上向量的大小,最终会陷入无限循环。


.at()没有这个问题,因为它只索引到向量中,而不会改变它的大小。只要 to 的参数at是有效索引,您就可以毫无问题地访问此位置。


for*_*818 5

问题在于您将元素推入永不停止的循环中:

for (unsigned i=0; i<myvector.size(); i++)
{
   myvector.push_back("hi");  //Note: using push_back here.
}
Run Code Online (Sandbox Code Playgroud)

在第一次迭代之后,向量将有4元素并且i将是1。当您i在每次迭代中递增1 并且myvector.size()也递增 1 时,条件永远不会为假。

std::vector::at另一方面,不会向向量添加元素。因此,在 3 次迭代后,循环结束。