如何在C++中复制向量中的数组元素
数组是存储在连续内存位置的项目的集合。这个想法是将多个相同类型的项目存储在一起。
向量与动态数组相同,能够在插入或删除元素时自动调整自身大小,其存储由容器自动处理。
以下是将元素从数组复制到向量的不同方法:
方法 1:朴素的解决方案
遍历整个数组并使用 push_back()函数将每个元素插入到新分配的向量中。 下面是上述方法的实现:
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Traverse the array and
for (int i = 0; i < N; i++)
v.push_back(arr[i]);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize a vector by passing the
// pointer to the first and last element
// of the range as arguments
vector v(arr, arr + N);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Add array elements in the required
// range into a vector from beginning
v.insert(v.begin(), arr, arr + N);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Copy array elements in the required
// range into vector v using copy function
copy(begin(arr), end(arr), back_inserter(v));
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Assign the elements of the array
// into the vector v
v.assign(arr, arr + N);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
C++14
// C++ program of the above approach
#include
using namespace std;
// Function to increment the value by 1
int increment(int x)
{
return x + 1;
}
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Copy the elements of the array into
// vector v and increment each value
transform(arr, arr + N, back_inserter(v), increment);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
1 2 3 4 5
方法 2:初始化期间基于范围的分配
在 C++ 中,Vector 类提供了一个接受范围的构造函数,因此要从数组元素创建向量,在需要复制到向量的向量初始化期间将指向范围的第一个和最后一个位置的指针作为参数传递即,(arr,arr+N)。
下面是上述方法的实现:
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize a vector by passing the
// pointer to the first and last element
// of the range as arguments
vector v(arr, arr + N);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
1 2 3 4 5
请注意,也可以使用用于指向 STL 容器的内存地址的迭代器。
- std::begin(arr)- 迭代到数组的第一个元素。
- std::end(arr)- 指向数组最后一个元素之后的迭代器。
vector
方法三:使用内置函数Insert(position, first_iterator, last_iterator): insert()是C++ STL中的内置函数,它在指定位置的元素之前插入新元素,有效地增加了容器大小的元素数量插入。除了单个值,范围也可以作为参数传递。
下面是上述方法的实现:
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Add array elements in the required
// range into a vector from beginning
v.insert(v.begin(), arr, arr + N);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
4 6 8 10 12
方法 4:使用内置函数Copy(first_iterator, last_iterator, back_inserter()):这是将数组元素复制到向量中的另一种方法是使用内置复制函数。该函数接受 3 个参数,一个指向数组第一个元素的迭代器,一个指向数组最后一个元素的迭代器,以及从后面插入值的 back_inserter函数。
下面是上述方法的实现:
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Copy array elements in the required
// range into vector v using copy function
copy(begin(arr), end(arr), back_inserter(v));
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
1 2 3 4 5
方法 5:使用内置函数Assign( first_iterator, last_iterator ): vector::assign()函数可用于为新向量或已存在的向量赋值。如有必要,它还可以修改向量的大小。它将迭代器带到第一个和最后一个位置作为参数。
下面是上述方法的实现:
C++
// C++ program of the above approach
#include
using namespace std;
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Assign the elements of the array
// into the vector v
v.assign(arr, arr + N);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
1 2 3 4 5
方法 6:使用内置函数Transform(first_iterator, last_iterator, back_insert(), 函数): std::transform()函数接受 4 个参数,一个指向数组第一个元素的迭代器,一个指向数组最后一个元素的迭代器,用于从后面插入值的 back_inserter函数和一个用户定义的函数,可用于修改数组的所有元素,即执行一元运算,将小写字符转换为大写字符等。
下面是上述方法的实现:
C++14
// C++ program of the above approach
#include
using namespace std;
// Function to increment the value by 1
int increment(int x)
{
return x + 1;
}
// Driver code
int main()
{
// Initialise an array
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
// Initialize an empty vector
vector v;
// Copy the elements of the array into
// vector v and increment each value
transform(arr, arr + N, back_inserter(v), increment);
// Print all elements of vector
for (auto ele : v) {
cout << ele << " ";
}
return 0;
}
2 3 4 5 6