C++ Swap( )对vector进行内存的释放

本文探讨了C++标准模板库(STL)中vector容器的内存管理特性,特别关注于如何释放vector不再使用的内存空间。文中提供了具体示例,展示了通过swap技巧来实现内存的有效回收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,vector与deque不同,其内存占用空间只会增长,不会减小。比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。所有空间在vector析构时回收。


   empty()是用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),所占用的内存空间依然如故。如果你需要空间动态缩小,可以考虑使用deque。如果非要用vector,这里有一个办法:

   vector<int> nums;
   nums.push_back(1);

   nums.push_back(1);

   nums.push_back(2);

   nums.push_back(2);
   vector<int>().swap(nums); //或者nums.swap(vector<int>());

   vector<int>().swap(nums); 或者如下所示 加一对大括号都可以,意思一样的:  
   { 
     std::vector<int> tmp =   nums;   
     nums.swap(tmp); 
    }


### 如何在C++中使用 `swap` 函数来交换两个 `vector` 的内容 在 C++ 中,可以通过标准库中的 `std::swap` 函数或者 `std::vector` 容器自身的成员函数 `swap()` 来实现两个向量之间的内容交换。以下是详细的说明以及示例代码。 #### 使用 `std::swap` 进行交换 `std::swap` 是一个通用的标准库函数,定义于 `<utility>` 头文件中。它能够接受任意类型的参数并完成它们的值互换操作[^3]。对于 `std::vector` 类型的对象来说,调用此版本会触发底层拷贝机制以重新分配内存资源给新的对象状态。 ```cpp #include <iostream> #include <vector> #include <utility> // for std::swap int main(){ std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = {4, 5}; std::cout << "Before swapping:\n"; std::cout << "vec1 contains :"; for(auto& elem : vec1){ std::cout << ' ' << elem; } std::cout << '\n'; std::cout << "vec2 contains :"; for(auto& elem : vec2){ std::cout << ' ' << elem; } std::cout << '\n'; // Using std::swap to exchange the contents of two vectors. std::swap(vec1, vec2); std::cout << "\nAfter swapping:\n"; std::cout << "vec1 contains :"; for(auto& elem : vec1){ std::cout << ' ' << elem; } std::cout << '\n'; std::cout << "vec2 contains :"; for(auto& elem : vec2){ std::cout << ' ' << elem; } std::cout << '\n'; return 0; } ``` #### 使用 `std::vector::swap` 成员方法进行交换 除了全局命名空间下的 `std::swap` 方法外,`std::vector` 自身也提供了专门针对其内部数据结构优化过的 `swap` 成员方法。该方式通常比普通的 `std::swap` 更高效,因为它只涉及指针级别的调整而非实际的数据复制过程[^1]^。 ```cpp #include <iostream> #include <vector> int main(){ std::vector<int> vecA = {7,8,9}; std::vector<int> vecB = {10,11,12,13}; std::cout << "Prior to member swap call:\n"; std::cout << "Vector A has elements: "; for(int val : vecA) std::cout << val << ", "; std::cout << "\b\b.\n"; std::cout << "Vector B holds values: "; for(int val : vecB) std::cout << val << ", "; std::cout << "\b\b.\n\n"; // Utilizing vector's built-in swap method instead of global one. vecA.swap(vecB); std::cout << "Post member swap invocation:\n"; std::cout << "Now Vector A consists of items: "; for(int val : vecA) std::cout << val << ", "; std::cout << "\b\b.\n"; std::cout << "And now Vector B comprises entries: "; for(int val : vecB) std::cout << val << ", "; std::cout << "\b\b."<<'\n'; return 0; } ``` 以上两种方法都可以有效地达到交换两组动态数组的目的,但在性能上推荐优先考虑容器自带的 `swap` 功能,因为它是特别设计用来处理同类别的 STL 容器实例间的快速转换需求的[^4]^。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值