【发布时间】:2014-07-05 18:10:39
【问题描述】:
指针如何作用于数组和向量对象
对于数组_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 怎么来的(就像在这种情况下向量),它正在获取我的迭代值?
为什么 For vector_2 的工作方式与 For 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 给出了错误。 谢谢。
【问题讨论】:
-
你没有使用
std::array<>? -
没有任何区别我得到了这两个代码的正确输出(使用命名空间标准),
-
如果您对函数返回的内容没有信心,我真的不建议您使用
auto关键字。a.begin()返回一个迭代器,它重载了operator *以给出它所指向的元素的值。就示例 2 而言,在使用auto关键字后不应该使用星号 - 它违背了auto关键字的目的,它告诉编译器auto自动推断类型。 -
另外,不推荐使用
decltype(...),除非您正在执行相对复杂的模板元编程或函数绑定。 (你不是)。 @DieterLücking 基本上告诉你为什么向量 2 的例子是错误的。你从不使用auto *,只使用auto、auto &和const auto &。在您更加熟悉 STL 以及如何操作它之前,我建议永远不要使用 auto 关键字。 -
@user3232918 '没有任何区别' 恐怕你误解了我的意思。我的意思是:您的代码中没有任何实例
std::array<std::array<int,3>,4>。那你为什么要#include <array>?
标签: c++ arrays pointers c++11 vector