Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过第0个位置引用解析此向量_C++_C++11_Vector_Stl_Iterator - Fatal编程技术网

C++ 如何通过第0个位置引用解析此向量

C++ 如何通过第0个位置引用解析此向量,c++,c++11,vector,stl,iterator,C++,C++11,Vector,Stl,Iterator,我试图从第一个元素的引用解析这个简单数组 这是我的密码: #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 )

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

这是我的密码:

#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 << " ";
    }
}
#包括
#包括
#包括
int main()
{
向量vec3{1,2,3,4,5};
for(vector::iterator ptr=&vec3[0];ptr!=vec3.end();++ptr)
{

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

编译器错误表明没有从类型
value\u type*
到迭代器类型的隐式转换

所以一般来说,你必须写作

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

如果让
vec
成为类型为
std::vector
的对象,那么
vec.end()
返回一个
std::vector::iterator
,它可以不同于相应的原始指针
int*
。这样做的原因之一是允许支持调试和错误检查(例如,越界访问)

因此,您必须编写
&(*vec.begin())
来获取向量的第一个元素的地址,而不仅仅是
vec.begin()
,因为后者不一定返回原始指针

您可以轻松检查
&vec[0]
vec.end()
在您的实现中是否具有相同的类型:

auto a = vec.end(); 
auto b = &vec[0];
static_assert(std::is_same<decltype(a), decltype(b)>::value, "not same type");
auto a=vec.end();
自动b=&vec[0];
静态断言(std::is_same::value,“非相同类型”);
就我而言:

错误:静态断言失败“类型不同”
静态断言(std::is\u same::value…


你应该做
vector::iterator ptr=vec3.begin()
或者,更好的是
auto ptr=vec3.begin()
,甚至更好的是:
for(auto&el:vec3){cout-mable-dup:You可以,但不能混用。
&vec3[a]
不是迭代器。它是
int*
。你不能将它与
end()比较
或者;您应该执行:
for(int*ptr=&vec3[0];ptr!=&vec3[vec3.size()];ptr++)或者类似的操作lines@Mirko从技术上讲,它是一种迭代器……它与
vector::iterator
;)不同
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;
}
auto a = vec.end(); 
auto b = &vec[0];
static_assert(std::is_same<decltype(a), decltype(b)>::value, "not same type");