指针如何用于数组和矢量对象
对于array_1
#include <iostream>
#include <array>
using namespace std;
int main(){
int a[3][4]={0,1,3,3,4,5,6,7,8,9,10,11};
//int (*pi)[4]=a;
for( auto *pi=a; pi!=a+3; ++pi ){
for( auto p=*pi; p!=*pi + 4; ++p){
cout << *p << "\n";
}
}
}
对于array_2
#include <iostream>
#include <array>
using namespace std;
int main(){
int a[3][4]={0,1,3,3,4,5,6,7,8,9,10,11};
//int (*pi)[4]=a;
for( auto pi=a; pi!=a+3; ++pi ){
for( auto p=*pi; p!=*pi + 4; ++p){
cout << *p << "\n";
}
}
}
对于vector_1
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> a{0,1,3,3,4,5,6,7,8,9,10,11};
for(auto i=a.begin(); i!=a.end(); ++i ){
// we can also use begin(a) and end(a)
cout << *i << "\n";
}
}
对于vector_2
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> a{0,1,3,3,4,5,6,7,8,9,10,11};
for(auto *i=a.begin(); i!=a.end(); ++i ){
// we can also use begin(a) and end(a)
cout << *i << "\n";
}
}
两个代码(对于array_1和array_2)给出相同的输出,即(0-11)
你可以看到两段代码的第一个for循环存在差异。
在 For vector_1 中,据我所知,我认为,我正在向量的开头创建指针i
,然后取消引用它以获取相应位置的值。现在我的疑问是,当我在第二个for循环中使用*pi
时,如何使用 For array_1 和 For array_2 ,而不是取消引用(如矢量的情况),它是取给我的迭代值?
为什么对于vector_2 的工作方式与对于vector_1 的工作方式不同?
向量的size()
和begin()/end()
函数的返回类型是什么?
因为当我使用 for(decltype(a.size())i = 0; i!= end(); ++ i)时,它会给我一个类型转换错误。
array_1的代码,array_2和vector_1的代码给出相同的输出(0-10)。导致错误的是 for vector_2 。 感谢。
答案 0 :(得分:0)
如果 vector_1 你没有创建一个指针,而是一个迭代器 - 在大多数基本用例中,比如打印矢量结果,迭代器可以正常工作,就像一个指针,但它不相同,不应该像处理指针一样处理。如果是 vector_2 ,你会做一些讨厌的事情,因为这是 auto 关键字的工作,以确定变量是否是指针。
最后一个示例导致错误,因为您正在尝试创建指向迭代器的指针,而 begin()函数返回的类型是迭代器(值),而不是迭代器对象的地址。
如果您想知道 size(), begin()等函数的返回类型,您可以随时参考几个大型C ++参考之一网站,例如:
www.cplusplus.com
www.cppreference.com