【问题标题】:Pointers to an Array and Vector object指向 Array 和 Vector 对象的指针
【发布时间】: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_1For 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&lt;&gt;
  • 没有任何区别我得到了这两个代码的正确输出(使用命名空间标准),
  • 如果您对函数返回的内容没有信心,我真的不建议您使用 auto 关键字。 a.begin() 返回一个迭代器,它重载了 operator * 以给出它所指向的元素的值。就示例 2 而言,在使用 auto 关键字后不应该使用星号 - 它违背了 auto 关键字的目的,它告诉编译器 auto 自动推断类型。
  • 另外,不推荐使用decltype(...),除非您正在执行相对复杂的模板元编程或函数绑定。 (你不是)。 @DieterLücking 基本上告诉你为什么向量 2 的例子是错误的。你从不使用auto *,只使用autoauto &amp;const auto &amp;。在您更加熟悉 STL 以及如何操作它之前,我建议永远不要使用 auto 关键字。
  • @user3232918 '没有任何区别' 恐怕你误解了我的意思。我的意思是:您的代码中没有任何实例std::array&lt;std::array&lt;int,3&gt;,4&gt;。那你为什么要#include &lt;array&gt;

标签: c++ arrays pointers c++11 vector


【解决方案1】:

vector_1 的情况下,您创建的不是指针,而是 iterator - 在大多数基本用例中,例如打印矢量结果,迭代器可以像指针,但它不一样,不应该像处理指针一样处理。在 vector_2 的情况下,您会做一些讨厌的事情,因为这是 auto 关键字的工作来确定变量是否是指针。

最后一个例子导致错误,因为你试图创建一个指向迭代器的指针,而begin()函数返回的类型是一个 iterator(一个值),而不是迭代器对象的地址

如果您想了解size()begin()等函数的返回类型,您可以随时参考几大C++参考资料之一网站,例如:

www.cplusplus.com

www.cppreference.com

【讨论】:

  • &a.begin() 给你留下一个临时地址。
  • 哦,对了。 VS 2012 出于某种原因并没有对此抱怨。我已经从答案中删除了那部分。
  • 获取临时地址是MSVC 扩展,带有/W4 的IIRC 可能会发出警告。
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 2016-02-19
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多