【问题标题】:How to understand "vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) )"?如何理解“vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) )”?
【发布时间】:2019-12-19 17:50:35
【问题描述】:

在下面的代码中,

是什么意思
vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) );

main()?

vector<int> bubbleSort(vector<int> avector) { //the vector for bubble sort
  for (int passnum = avector.size()-1; passnum > 0; passnum -= 1) {
      for (int i = 0; i < passnum; i++) {
          if (avector[i] > avector[i+1]) {
              int temp = avector[i];
              avector[i] = avector[i+1];
              avector[i+1] = temp;
          }
      }
  }
  return avector;
}

int main() {
    // Vector initialized using a static array
    static const int arr[] = {54,26,93,17,77,31,44,55,20};
    vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) );

    vector<int> bvector = bubbleSort(avector);
    for (unsigned int i = 0; i < bvector.size(); i++) {
        cout<<bvector[i]<< " ";
    }
    return 0;
}

谢谢!

杰夫

【问题讨论】:

  • 如果arr 是一个数组(不是指针),就像在您的代码中一样,那么sizeof(arr) 是整个数组在内存中的大小,sizeof(arr[0]) 是一个数组的大小数组的元素,所以sizeof(array)/sizeof(array[0]) 是数组中元素的数量。在avector的定义中,arr被转换为一个指针(等于&amp;arr[0]),arr + sizeof(arr)/sizeof(arr[0])arr的过去的地址。所以代码正在创建一个包含arr 的所有元素的向量。除非编译器知道arr 是一个数组,否则该技术不起作用。
  • sizeof(arr)/sizeof(arr[0]) 是一个用于获取数组大小的 C hack。在 C++ 中,初始化应该写成vector&lt;int&gt; avector(std::begin(arr), std::end(arr));

标签: c++ arrays vector stl


【解决方案1】:

avector 是通过复制arr 的所有元素来构造的。

它使用向量的以下constructor

template< class InputIt >
vector( InputIt first, InputIt last, 
        const Allocator& alloc = Allocator() );

【讨论】:

    【解决方案2】:

    n = sizeof(arr) / sizeof(arr[0]) 是数组存储的元素数。

    avector(arr, arr + sizeof(arr) / sizeof(arr[0]) 表示将数组arr的元素从索引0复制到avector向量n-1(含)

    【讨论】:

    • 最好说“0 to n-1(包括)”说“0 to n(不包括)”可能会被误解,尤其是非母语人士(例如它适用于0n,或者[如你所愿] 到n?)
    【解决方案3】:
    vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) );
    

    arr C 样式数组初始化std::vectoravector

    参数是迭代器。这些迭代器定义了一系列元素:

    • arr:指向要复制的范围的第一个元素的迭代器。
    • arr + sizeof(arr) / sizeof(arr[0]):迭代器指向要复制的范围的past-the-end 元素

    C++11 方法是使用函数模板 std::cbegin()std::cend() 用于 C 样式数组:

    vector<int> avector(std::cbegin(arr), std::cend(arr));
    

    这种方法利用模板参数推导来推断 C 样式数组的大小。这种方式不易出错,因为它需要的输入更少。

    【讨论】:

    • 谢谢大家的详细解释!我从所谓的现代 C++ 14 开始学习 C++,所以我对这种旧风格几乎没有概念。学习很有趣也很有趣。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2021-05-12
    • 2021-09-16
    • 2011-11-04
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多