我目前正在使用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;
}
答案 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已经为这部分提供了一个非常好的答案