21xrx.com
2024-09-20 05:51:56 Friday
登录
文章检索 我的文章 写文章
C++ 向量的复制操作
2023-07-04 22:54:33 深夜i     --     --
C++ vector 复制操作

在 C++ 编程中,向量(vector)是一个常用的数据容器,用于存储一组动态大小的元素。常见的向量操作包括添加、删除、查找和排序等。而在实际开发中,往往需要进行向量的复制操作,即将一个向量的内容复制到另一个向量中。本文将介绍 C++ 向量的复制操作,包括浅复制和深复制两种方式。

一、浅复制

浅复制(Shallow Copy)是一种将一个向量的指针直接赋值给另一个向量的方式。这种方式只是将指针指向向量的地址复制了一遍,而没有复制向量的实际内容。因此,在对复制后的向量进行修改时,原始向量的内容也会随之发生改变,这就是所谓的“共享内存”(Shared Memory)。

以下是浅复制的示例代码:


#include <iostream>

#include <vector>

using namespace std;

int main() {

  vector<int> vec1 = 3;

  vector<int> vec2 = vec1;

  cout << "vec1: ";

  for (auto i : vec1)

    cout << i << " ";

  

  cout << endl;

  cout << "vec2: ";

  for (auto i : vec2)

    cout << i << " ";

  

  cout << endl;

  vec2[0] = 10;

  cout << "After changing vec2: " << endl;

  cout << "vec1: ";

  for (auto i : vec1)

    cout << i << " ";

  

  cout << endl;

  cout << "vec2: ";

  for (auto i : vec2)

    cout << i << " ";

  

  cout << endl;

  return 0;

}

输出结果如下:


vec1: 1 2 3 4 5

vec2: 1 2 3 4 5

After changing vec2:

vec1: 10 2 3 4 5

vec2: 10 2 3 4 5

可以看到,修改 vec2 的第一个元素后,vec1 的第一个元素也发生了改变。这是因为 vec1 和 vec2 共享同一块内存,指向同一个地址。

二、深复制

深复制(Deep Copy)是一种将一个向量的内容完全复制一份到另一个向量中的方式。这种方式需要重新申请一块内存,并将原始向量的内容依次复制到新的内存中。因此,在对复制后的向量进行修改时,原始向量的内容不会发生改变,这就是所谓的“独立内存”(Independent Memory)。

以下是深复制的示例代码:


#include <iostream>

#include <vector>

using namespace std;

int main() {

  vector<int> vec1 = 2;

  vector<int> vec2(vec1.begin(), vec1.end());

  cout << "vec1: ";

  for (auto i : vec1)

    cout << i << " ";

  

  cout << endl;

  cout << "vec2: ";

  for (auto i : vec2)

    cout << i << " ";

  

  cout << endl;

  vec2[0] = 10;

  cout << "After changing vec2: " << endl;

  cout << "vec1: ";

  for (auto i : vec1)

    cout << i << " ";

  

  cout << endl;

  cout << "vec2: ";

  for (auto i : vec2)

    cout << i << " ";

  

  cout << endl;

  return 0;

}

输出结果如下:


vec1: 1 2 3 4 5

vec2: 1 2 3 4 5

After changing vec2:

vec1: 1 2 3 4 5

vec2: 10 2 3 4 5

可以看到,修改 vec2 的第一个元素后,vec1 的第一个元素并没有发生改变。这是因为 vec1 和 vec2 占用的是两块独立的内存,互不影响。

总结

在进行向量的复制操作时,需要根据具体情况选择浅复制或深复制。如果需要在复制后的向量中修改元素,并且不希望原始向量的内容发生变化,应该选择深复制。如果只是需要在复制后的向量中查找、排序或删除元素,并不需要修改元素,可以选择浅复制,以节省内存和时间。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复