Arrays 将矢量内容复制到数组练习中 我现在正在通过C++入门第五版进行工作。在第三章练习3.42中,我被要求“编写一个程序,将int向量复制到int数组中。”

Arrays 将矢量内容复制到数组练习中 我现在正在通过C++入门第五版进行工作。在第三章练习3.42中,我被要求“编写一个程序,将int向量复制到int数组中。”,arrays,c++11,vector,Arrays,C++11,Vector,下面的代码可以工作。不过,我有几个问题 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::

下面的代码可以工作。不过,我有几个问题

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;
}
//练习3.42
#包括“stdafx.h”
#包括
#包括
使用std::vector;
使用std::begin;
使用std::endl;
使用std::cout;
使用std::end;
int main(){
向量ivec={1,2,3,4,5};//初始化向量ivec。
int arr[5];//用5个空元素初始化数组“arr”。
int i1=0;//初始化名为i1的int。
对于(向量::迭代器i2=ivec.begin();i2!=ivec.end();++i2){
arr[i1]=*i2;//将ivec中的元素分配到arr中。
++i1;//迭代到arr中的下一个元素。
}
for(int r1:arr){//range for打印出arr中的所有元素。
CUT< P> <强> 1)在数组中,你不能使用可移植的C++:数组长度在编译时是固定的,但是你可以用向量

2)当然,假设目标阵列足够大,请使用:


同时使用
移除所有这些
,它们只不过是噪音。稍微清洁一下可以:

#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;
}


注意:

如果您想为副本保留手写循环,一种更规范的/c++11方法是:

auto i1 = std::begin(arr);
auto i2 = std::begin(ivec);
while ( i2 != std::end(ivec)){ 
    *i1++ = *i2++;
}
1) 如果需要一个长度在编译时未知的数组,可以在堆上动态创建该数组(在实际代码中,通常应该使用std::vector):

但是,这还有一些其他缺点。例如,开始(arr)/结束(arr),因此循环的范围不再工作,您必须在某个点手动删除数组(我不知道您是否已经了解了RAII和智能指针)

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

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, " "));
}
auto i1 = std::begin(arr);
auto i2 = std::begin(ivec);
while ( i2 != std::end(ivec)){ 
    *i1++ = *i2++;
}
int* arr=new int[ivec.size()];