【问题标题】:any clear explanation of this?对此有任何明确的解释吗?
【发布时间】:2020-11-12 11:55:27
【问题描述】:

我正在尝试学习 C++ 向量。这是代码:

#include <iostream>
#include <vector>
using namespace std;
    
int main(){
    
    vector <int> vec;
    
    for(int i=0; i<=10; i++){
        vec.push_back(i);
    }

    for(auto i=vec.begin(); i!=vec.end();i++){
        cout<<*i<<" ";
    }
}

谁能告诉我这部分是什么?

for(auto i=vec.begin(); i!=vec.end();i++){
    cout<<*i<<" ";
}  

我搜索了互联网,但没有找到明确的解释。

好的,它会打印出我们放入向量中的数字,但我能得到更技术性的解释吗?

【问题讨论】:

  • 迭代器,真不敢相信,无论你在哪里了解向量,都没有提到迭代器。它们是标准库中极其重要的概念。
  • 也许我应该改变我正在看的教程谢谢你的回答。
  • 听起来你正在尝试从 YouTube 学习 C++,这是一个可怕的来源。外面有太多人不知道他们在说什么。我建议你切换到good book

标签: c++ arrays loops vector integer


【解决方案1】:
for(auto i=vec.begin(); i!=vec.end();i++){
    cout<<*i<<" ";
}  

这只是 C++ 中的迭代器。

  • begin()函数用于返回一个指向向量第一个元素的迭代器。

  • 同样,end() 函数用于返回一个迭代器,该迭代器指向向量的最后一个元素。

  • auto 只是推导出变量i 的类型。您也可以将其指定为 std::vector&lt;int&gt;::iterator i = vec.begin() 。这就是您用来循环向量的迭代器的类型。

  • 在上面的代码中,你基本上是从向量的开头迭代到向量的结尾。

  • 在循环内部,您只是取消引用迭代器并在迭代器所在的当前位置打印值。

上面这段代码所做的与下面的循环类型基本相同,它使用索引来循环数组:

for(size_t i = 0; i != vec.size() ; i++){
    cout << vec[i] << " ";
}

您应该阅读有关迭代器的更多信息,因为它们是 C++ 中的核心概念。你可以在这里阅读更多关于它们的信息:

iterators

std::vector.begin()

std::vector.end()

【讨论】:

  • @MücahitUğurlu 很高兴为您提供帮助 :)
【解决方案2】:

该部分只是打印向量的所有元素。 auto 自动根据定义它的参数自动确定它所使用的数据结构。在这种情况下,它被用作vector&lt;int&gt;::iterator。大多数情况下,这用于其他数据结构,例如mapset,因为它们不支持随机访问。在向量中,你可以简单地做

for(int i = 0; i < vec.size(); i++)
{
    cout << vec[i] << " ";
}

【讨论】:

  • "auto 就像一个“通配符”,可以用作任何数据结构" - auto 不是这样。你描述的是std::anyauto 仅用于“类型推导”。被声明的变量仍然需要特定的类型,但编译器可以根据被分配变量的值类型推断该类型。这根本不是“通配符数据结构”。
  • 是的,我有点困惑。现在已经编辑了。谢谢!
【解决方案3】:

这是向量中第一个元素的迭代器:vec.begin()

一个遍历向量最后一个元素的迭代器:vec.end()

autovec.begin() 推导出 i 的类型,它是一个迭代器。我们真的不需要关心确切的类型。

我们只需要知道我们可以递增它:i++

并比较两个迭代器以检查我们是否在最后:i != vec.end()

而且我们可以使用迭代器来获取“指向”的元素:*i

如果没有迭代器,循环可以写成:

for (size_t i=0; i<vec.size(); ++i) {
    std::cout << vec[i];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多