当前位置:实例文章 » JAVA Web实例» [文章]深入篇【C++】谈vector中的深浅拷贝与迭代器失效问题

深入篇【C++】谈vector中的深浅拷贝与迭代器失效问题

发布人:shili8 发布时间:2025-01-19 23:15 阅读次数:0

**深入探讨 C++ 中的 vector、深浅拷贝与迭代器失效**

在 C++ 中,`vector` 是一个非常常用的容器类,它提供了动态数组的功能。然而,在使用 `vector` 时,我们经常会遇到一些问题,如深浅拷贝和迭代器失效等。在本文中,我们将深入探讨这些问题,并提供示例代码来帮助理解。

###1. 深浅拷贝在 C++ 中,对象的拷贝分为两种:浅拷贝和深拷贝。浅拷贝只复制对象的引用,而深拷贝则复制整个对象。

#### 浅拷贝示例:

cpp#include <iostream>
#include <vector>

class Person {
public:
 std::string name;
 int age;

 Person(std::string n, int a) : name(n), age(a) {}
};

int main() {
 Person p("John",30);
 std::vector<Person> vec = {p}; // 浅拷贝 for (const auto& person : vec) {
 std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl;
 }

 return0;
}


在上面的示例中,我们创建了一个 `Person` 对象,并将其添加到 `vector` 中。由于 `vector` 使用浅拷贝来复制对象,因此当我们修改 `vec[0]` 的属性时,原始对象也会受到影响。

#### 深拷贝示例:

cpp#include <iostream>
#include <vector>

class Person {
public:
 std::string name;
 int age;

 Person(std::string n, int a) : name(n), age(a) {}
};

int main() {
 Person p("John",30);
 std::vector<Person> vec = {p}; // 浅拷贝 for (auto& person : vec) {
 person.name = "Jane"; // 修改属性 }

 std::cout << "Original Name: " << p.name << ", Original Age: " << p.age << std::endl;

 return0;
}


在上面的示例中,我们尝试修改 `vec[0]` 的属性,但由于使用浅拷贝,因此原始对象的属性也会受到影响。

###2. 迭代器失效迭代器失效是指当容器中的元素被添加、删除或重新排列时,迭代器将失效。这种情况在 `vector` 中尤其常见,因为它使用动态数组来存储元素。

#### 示例:

cpp#include <iostream>
#include <vector>

int main() {
 std::vector<int> vec = {1,2,3};

 auto it = vec.begin();

 vec.push_back(4); // 添加新元素 for (; it != vec.end(); ++it) {
 std::cout << *it << " ";
 }

 return0;
}


在上面的示例中,我们首先创建一个 `vector`,然后使用迭代器 `it` 来遍历容器中的元素。接着,我们添加新元素到容器中,但由于迭代器 `it` 已经失效,因此它将指向未知位置。

### 总结在本文中,我们探讨了 C++ 中的 `vector`、深浅拷贝和迭代器失效问题。通过示例代码,我们可以看到使用浅拷贝会导致对象属性被修改,而使用深拷贝则不会。同时,我们也看到了迭代器失效的问题,尤其是在添加或删除容器中的元素时。

在实际开发中,了解这些问题的重要性和解决方法对于编写高质量的 C++代码至关重要。

其他信息

其他资源

Top