将矢量内容复制到数组练习中

时间:2014-11-29 05:24:50

标签: arrays c++11 vector

我目前正在使用C ++ Primer第5版。在第3章练习3.42中,我被要求编写程序将int的矢量复制到int的数组中。"

以下代码有效。不过我有几个问题。

1)第16行,

int arr[5]; 

初始化一个包含5个元素的数组。如何更改数组以使其自动获得/具有与矢量ivec相同的大小?

2)到目前为止,是否有更简单的方法来编写本书所教授的程序?

//Exercise 3.42

#include "stdafx.h"
#include <iostream>
#include <vector>

using std::vector;
using std::begin;
using std::endl;
using std::cout;
using std::end;

int main(){

vector<int> ivec = { 1, 2, 3, 4, 5 }; //initializes vector ivec.
int arr[5]; //initializes array "arr" with 5 null elements.
int i1 = 0; // initializes an int named i1.

for (vector<int>::iterator i2 = ivec.begin(); i2 != ivec.end(); ++i2){ 
    arr[i1] = *i2; //assigned the elements in ivec into arr.
    ++i1; // iterates to the next element in arr.
}

for (int r1 : arr){ //range for to print out all elements in arr.
    cout << r1 << " ";
}
cout << endl;

system("pause");
return 0;
}

2 个答案:

答案 0 :(得分:1)

1)您不能在带有数组的可移植C ++中:数组长度在编译时是固定的。但你可以使用矢量

2)当然,假设目标数组足够大,请使用std::copy

std::copy(std::begin(ivec), std::end(ivec), arr);

同时删除所有using,它们只不过是噪音。稍微清理一下:

#include <iostream>
#include <algorithm>
#include <vector>

int main(){

  std::vector<int> ivec = { 1, 2, 3, 4, 5 };
  int arr[5];

  std::copy(std::begin(ivec), std::end(ivec), arr);

  for (auto r1 : arr){
    std::cout << r1 << ' ';
  }
  std::cout << std::endl;
}

您甚至可以重复使用std::copy来打印矢量内容:

int main(){

  std::vector<int> ivec = { 1, 2, 3, 4, 5 }; //initializes vector ivec.
  int arr[5]; //initializes array "arr" with 5 null elements.

  std::copy(std::begin(ivec), std::end(ivec), arr);
  std::copy(arr, arr + 5, std::ostream_iterator<int>(std::cout, " "));
}

<强> Live demo


注意:

如果你想为副本保留一个手写循环,那么更常规的/ c ++ 11方法是:

auto i1 = std::begin(arr);
auto i2 = std::begin(ivec);
while ( i2 != std::end(ivec)){ 
    *i1++ = *i2++;
}

答案 1 :(得分:0)

1)如果你需要一个长度在编译时不知道的数组,你可以在堆上动态创建数组(在实际代码中你通常应该使用std :: vector):

int* arr=new int[ivec.size()]; 

然而,这有一些其他缺点。例如。 begin(arr)/ end(arr)因此循环范围不再起作用,你必须在某个时候手动删除数组(我不知道你是否已经了解了RAII和智能指针)

2)quantdev已经为这部分提供了一个非常好的答案