在矢量中使用size()函数时出错



所以我第一次开始学习向量,并编写了一个简单的程序,如下所示:

#include <iostream> 
#include <vector> 
using namespace std; 
int main() 
{ 
vector<int> g1; 
int n;
cout<<"enter values"<<endl;
do
{
cin>>n;
g1.push_back(n);
} while (n);
cout<<"Vector values are: "<<endl;
for(auto i=g1.begin(); i<g1.size();i++)
cout<<*i<<endl;
} 

当我尝试执行它时,会出现一个错误:;类型不匹配";在g1.size((部分。为什么会发生这种情况?我为所涉及的迭代器使用了auto关键字,并认为不会有任何问题?

这是使用auto的缺点。如果你不知道auto的结果是什么,你也不知道为什么它与你期望的完全不同!

std::vector::begin提供了一个std::vector::iterator,您无法将其与std::vector::size的结果size_type值进行比较。这种类型通常是std::size_t

你必须与另一个迭代器进行比较,迭代器是向量末尾的表示,比如:

for(auto i = g1.begin(); i != g1.end(); i++)

至少有三种方法可以迭代向量的内容。

你可以使用一个索引:

for (int i = 0; i < vec.size(); ++i)
std::cout  << vec[i] << 'n';

您可以使用迭代器:

for (auto it = vec.begin(); it != vec.end(); ++it)
std::cout << *it << 'n';

您可以使用基于范围的循环:

for (auto val : vec)
std::cout << Val <<'n';

后两者可以与任何容器一起使用。

g1.begin()向第一个元素返回一个迭代器,而g1.size()返回数量的元素。您无法将迭代器与大小进行比较,这就是您出现错误的原因。它与你使用auto无关,而是与你比较两个彼此无关的不同事物有关。

您需要更改循环以将i迭代器与向量的end()迭代器进行比较,例如:

for(auto i = g1.begin(); i != g1.end(); ++i)
cout << *i << endl;

或者,只需使用基于范围的for循环,它在内部使用迭代器:

for(auto i : g1)
cout << i << endl;

否则,如果要使用size(),则使用向量的operator[]的索引,而不是使用迭代器,例如:

for(size_t i = 0; i < g1.size(); ++i)
cout << g1[i] << endl;

最新更新