【问题标题】:Error during the usage of of size() function in vectors在向量中使用 size() 函数时出错
【发布时间】:2021-01-15 12:52:43
【问题描述】:

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

#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 关键字,并假设不会有任何问题?

【问题讨论】:

  • g1.begin() 产生 std::vector&lt;int&gt;::iterator 而不是 size_t
  • for (auto&amp;&amp; x : g1) cout &lt;&lt; x &lt;&lt; "\n"; 对于最后一个循环更可取: 1. for-range 而不是纠结于细节并弄错。 2. auto&amp;&amp; 原则上仍然避免复制,这对int 并不重要。 3. "\n" 避免昂贵的冲洗。
  • 不要如此含糊地描述错误。重复该消息。
  • 对于模糊的错误描述,我深表歉意。这是我在网上问的第一个问题
  • @vijay 您只需将i&lt;g1.size() 更改为i != g1.end() 即可修复循环条件。

标签: c++ vector stl iterator


【解决方案1】:

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

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

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

或者,只需使用 range-based for loop,它在内部使用迭代器:

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

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

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

【讨论】:

    【解决方案2】:

    至少有三种方法可以遍历向量的内容。

    你可以使用索引:

    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 循环:

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

    后两者可用于任何容器。

    【讨论】:

    • 谢谢!我还不熟悉基于范围的 for 循环,但这似乎是最简单的迭代方法..
    【解决方案3】:

    这是使用auto 的坏处。如果您不知道 auto 的结果是什么,您将不知道为什么它与您期望的完全不同!

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

    您必须与另一个迭代器进行比较,该迭代器表示向量的结尾,例如:

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

    【讨论】:

    • 正确。迭代器是一个抽象指针。询问指针是否小于整数是没有意义的。
    • OP 似乎知道begin() 会返回一个迭代器
    • std::vector&lt;T&gt;::size() 不会产生 int 类型。请准确。
    • @Klaus 这是一个unsigned long,可以产生很大的不同。特别是在循环中,我经常看到人们想知道为什么将size_t 值与小于0 相比的行为不会像他们认为的那样(当然忽略编译器警告)。否则我没有挑剔。
    • 整数值和int 值之间存在天壤之别。后者具有已知类型并且在指定范围内。只有 Java 将 int 装箱为 Integer 只是为了混淆视听。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2021-01-12
    • 2011-08-25
    • 1970-01-01
    • 2021-02-27
    • 2019-11-09
    相关资源
    最近更新 更多