对在 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 的方式有什么问题?这是我们向向量中插入元素的方式之一,对吧。
这个循环中的问题:
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 (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 次迭代后,循环结束。
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |