首页 > 解决方案 > 如何通过它的第 0 个位置引用来解析这个向量

问题描述

我试图从它的第一个元素的引用中解析这个简单的数组。

这是我的代码:

#include <iostream>
#include <vector>
#include <algorithm>     

int main()
{
    vector<int> vec3 { 1,2,3,4,5};
    for( vector<int>::iterator ptr = &vec3[0]; ptr != vec3.end(); ++ptr )
    {
        cout << *ptr << " ";
    }
}

但我收到此错误:

[Error] conversion from '__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type* {aka int*}' to non-scalar type 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' requested

有什么问题?

标签: c++c++11vectorstliterator

解决方案


std::vector 类的迭代器不是必需的指针(尽管它们可以这样定义,并且确实该类的一些旧实现将std::vector其迭代器定义为指针。)。它们通常被定义为类。

并且编译器错误说没有从类型value_type *到迭代器类型的隐式转换。

所以一般来说你必须写

vector<int> vec3 { 1,2,3,4,5};
for( vector<int>::iterator ptr = vec3.begin(); ptr != vec3.end(); ++ptr )
{
    cout << *ptr << " ";
}

但是,在这种特殊情况下,您可以使用基于范围的 for 语句。

vector<int> vec3 { 1,2,3,4,5};
for ( const auto &item : vec3 )
{
    cout << item << " ";
}

如果您确实想处理指针,那么循环可以通过以下方式查找

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> vec3 { 1, 2, 3, 4, 5 };

    for( auto ptr = vec3.data(); ptr != vec3.data() + vec3.size(); ++ptr )
    {
        std::cout << *ptr << ' ';
    }       

    std::cout << '\n';

    return 0;
}

推荐阅读