c++ - 在 C++ 中的 vector 中使用 push_back vs at

标签 c++ c++11

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

#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;
}
Output:    
Hangs after entering main.    
$ ./a.out    
In main
而如果我使用 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;
}

Output:
./a.out
In main
elements inserted into myvector
myvector contains:
hi
hi
hi
second element is hi
$
我使用 push_back 的方式有什么问题?这是我们在 vector 中插入元素的方法之一,对吧。

最佳答案

此循环中的问题:

for (unsigned i=0; i<myvector.size(); i++)
{
    myvector.push_back("hi");  //Note: using push_back here.
}
是如果你曾经进入循环,即myvector最初不是空的,然后每个 push_back将增加 vector 的大小。由于i在循环中每次递增一次,它永远不会 catch vector 的大小,并且最终会出现无限循环。
.at()没有这个问题,因为它只索引到 vector 中,而不会改变它的大小。只要参数 at是一个有效的索引,你可以毫无问题地访问这个位置。

关于c++ - 在 C++ 中的 vector 中使用 push_back vs at,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64715254/

相关文章:

c++ - 为什么两阶段查找会无法选择 'swap' 的重载版本?

c++ - 为什么 alignas() 不采用参数包?

c++ - 当类被 shared_ptr 包装时,std::min 元素出现奇怪的行为

c++ - 返回最低节点的名称

c++ - 具有成员 std::vector 的移动语义

c++ - 无锁原子循环队列无法正常工作

c++ - GCC "Internal compiler error: Error reporting routines re-entered"(包含完整代码)

c++ - 以编程方式在 MFC 中设置单选按钮状态

c++ - 使用模板处理string和wstring

c++ - 使用openmp使用eigen c++的Jacobi算法的并行化