精华内容
下载资源
问答
  • swapvector的特化

    2020-08-16 15:44:26
    最近遇到了vectorswap的操作,此前对于该部分并没有了解过,此处主要是通过实验、阅读源码以及网上一些博客后进行总结 关于swap 此处写了个非常简单的demo #include <iostream> #include <vector> ...

    最近遇到了vector的swap的操作,此前对于该部分并没有了解过,此处主要是通过实验、阅读源码以及网上一些博客后进行总结

    关于swap

    此处写了个非常简单的demo

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void printVec(const vector<int> &vec) {
        cout << "vector members: ";
        for(auto &num : vec) {
            cout << num << " ";
        }
        cout << endl;
    }
    
    int main() {
        vector<int> a = {1, 2, 3, 4, 5};
        vector<int> b;
    
        cout << "before swap: " << endl;
        cout << "a: ";
        printVec(a);
        cout << "b: ";
        printVec(b);
    
        a.swap(b);
    
        cout << "after swap: " << endl;
        cout << "a: ";
        printVec(a);
        cout << "b: ";
        printVec(b);
    
        return 0;
    }
    

    其输出结果相信也是比较直观的,就是交换了vector的内容

    before swap:
    a: vector members: 1 2 3 4 5
    b: vector members:
    after swap:
    a: vector members:
    b: vector members: 1 2 3 4 5
    

    但是具体交换了什么呢?

    此处可以查看起具体的实现源码

    void swap(vector& _Right) noexcept // strengthened
        {	// exchange contents with _Right
        if (this != _STD addressof(_Right))
            {	// (maybe) swap allocators, swap control information
            _Pocs(this->_Getal(), _Right._Getal());
            this->_Swap_all(_Right);
            _Swap_adl(this->_Myfirst(), _Right._Myfirst());
            _Swap_adl(this->_Mylast(), _Right._Mylast());
            _Swap_adl(this->_Myend(), _Right._Myend());
            }
        }
    

    同时在cpluscplus网站对此有介绍到

    Swap content
    Exchanges the content of the container by the content of x, which is another vector object of the same type. Sizes may differ.
    After the call to this member function, the elements in this container are those which were in x before the call, and the elements of x are those which were in this. All iterators, references and pointers remain valid for the swapped objects.
    Notice that a non-member function exists with the same name, swap, overloading that algorithm with an optimization that behaves like this member function.

    在做swap的时候,不仅两个容器的内容被交换,同时他们的迭代器、指针和引用也将被交换。在swap发生后,原先指向某容器中元素的迭代器、指针和引用仍然有效,并且指向相同的元素,即swap操作前后迭代器不失效。

    对于swap后关于迭代器部分可能过于绕口,此处提供简单的demo说明

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
        vector<int> v1 = {1, 3, 5};
        vector<int> v2 = {2, 4, 6};
        vector<int>::iterator it1 = v1.begin();
        vector<int>::iterator it2 = v2.begin();
        cout << "&v1[0]=" << &v1[0] << "\t\t"
             << "*it1=" << *it1 << endl;
        cout << "&v2[0]=" << &v2[0] << "\t\t"
             << "*it1=" << *it2 << endl;
    
        v1.swap(v2);
    
        cout << "after v1.swap(v2)" << endl;
        cout << "&v1[0]=" << &v1[0] << "\t\t"
             << "*it1=" << *it1 << endl;
        cout << "&v2[0]=" << &v2[0] << "\t\t"
             << "*it1=" << *it2 << endl;
    
        return 0;
    }
    
    &v1[0]=0x1c5e00         *it1=1
    &v2[0]=0x1c5e20         *it1=2
    after v1.swap(v2)
    &v1[0]=0x1c5e20         *it1=1
    &v2[0]=0x1c5e00         *it1=2
    

    可以看出经过swap后迭代器仍然有效,但是此处如果在迭代器遍历访问的时候终止条件应当是swap的另一个容器的end了。

    vector的swap妙用

    1. 释放vector多余的空间或者清空vector

    vector可自动增大容量,但是其不会自动的缩减的。可能大家都会记得vector还有个clear函数,但是clear只是删除存储在vector中的所有元素,并不是释放了vector的内存,其引用、指针、迭代器也是继续有效。那么当在一个较大的vector中删除了大量的元素之后,其实际的size比较小,而其capacity比较大,如果对空间比较敏感,希望vector的容量能够缩小一些。这时可以使用swap的技巧来实现,通过swap一个空的或者容量较小的vector对象达到该目的。

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
        vector<int> v1 = {1, 3, 5};
        vector<int> v2;
    
        cout << "before" << endl;
        cout << "size: " << "v1.size = " << v1.size() << ", v2.size = " << v2.size() << endl;;
        cout << "capacity: " << "v1.capacity = " << v1.capacity() << ", v2.capacity = " << v2.capacity() << endl;
    
        v1.swap(v2);
    
        cout << "after" << endl;
        cout << "size: " << "v1.size = " << v1.size() << ", v2.size = " << v2.size() << endl;;
        cout << "capacity: " << "v1.capacity = " << v1.capacity() << ", v2.capacity = " << v2.capacity() << endl;
    
        return 0;
    }
    
    size: v1.size = 3, v2.size = 0
    capacity: v1.capacity = 3, v2.capacity = 0
    after
    size: v1.size = 0, v2.size = 3
    capacity: v1.capacity = 0, v2.capacity = 3
    

    参考链接

    展开全文
  • 使用swap收缩vector空间

    2019-04-26 23:21:15
    1. swap用来交换两个vector vector<int> v1,v2; for (int i = 0; i < 5;i++){ v1.push_back(i); } for (int i = 6; i < 10;i++){ v2.push_back(i); } v1.swap(v2); 2. swap也可以用来收缩vector...

    1. swap用来交换两个vector

    vector<int> v1,v2;
    for (int i = 0; i < 5;i++){
        v1.push_back(i);
    }
    
    for (int i = 6; i < 10;i++){
        v2.push_back(i);
    }
    
    v1.swap(v2);

    2. swap也可以用来收缩vector空间
    使用resize分配100个空间,clear后,再增加两个,实际只使用了2个空间。vector<int>(v).swap(v)。创建一个临时的vector,用临时vector和v交互,交换后v的空间变为2个。临时vector变成100.本语句执行完之后,临时vector销毁,也就完成了vector空间收缩。

    vector<int> v;
    v.resize(100);
    
    cout << "容量:" << v.capacity() << endl;
    cout << "大小:" << v.size() << endl;
    
    v.clear();
    v.push_back(2);
    v.push_back(3);
    
    cout << "容量:" << v.capacity() << endl;
    cout << "大小:" << v.size() << endl;
    
    vector<int>(v).swap(v);
    
    cout << "容量:" << v.capacity() << endl;
    cout << "大小:" << v.size() << endl;
    展开全文
  • STL:swap收缩vector空间

    2019-09-02 12:32:07
    目录 size 与capacity区别 resize()并不能缩容 ... capacity 表示vector可容纳的元素大小,意思是容量,此方法返回的是该vector对象最多能容纳多少个元素。 #include<iostream> #inc...

    目录

    size 与 capacity区别

    resize()并不能缩容


    size 与 capacity区别

    • size 表示vector中元素的个数,此方法是返回该vector对象当前有多少个元素。

    • capacity 表示vector可容纳的元素大小,意思是容量,此方法返回的是该vector对象最多能容纳多少个元素。
       
    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    void PrintVector(vector<int>& v) //vector<int>  类型
    {
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		cout << *it << " ";
    
    	}
    	cout << endl;
    }
    
    int main()
    {
    	int arr[] = { 10,20,30 };
    	vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));//指针也是迭代器
    	cout << "size:" << v1.size() << endl;//元素个数
    	cout << "capacity:" << v1.capacity() << endl;//容量
    	PrintVector(v1);
    	v1.resize(2);
    	PrintVector(v1);
    	v1.resize(5);
    	PrintVector(v1);
    	v1.resize(6, 1);
    	PrintVector(v1);
    	cout << "size:" << v1.size() << endl;//元素个数
    	cout << "capacity:" << v1.capacity() << endl;//容量
    	return 0;
    }

    打印结果:

    ​​​​​​

     观察发现:size <= capacity
     

    resize()并不能缩容

    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    int main()
    {
    	vector<int> v;
    	for (int i = 0; i < 100000; i++)
    	{
    		v.push_back(i);
    	}
    	cout << "size:" << v.size() << endl;//元素个数
    	cout << "capacity:" << v.capacity() << endl;//容量
    
    	v.resize(10);
    	cout << "size:" << v.size() << endl;//元素个数
    	cout << "capacity:" << v.capacity() << endl;//容量
    
    	vector<int>(v).swap(v);
    	cout << "size:" << v.size() << endl;//元素个数
    	cout << "capacity:" << v.capacity() << endl;//容量
    	return 0;
    }
    

    打印结果:

    这里简单的使用swap,清除元素并回收内存

      vector<T>(v).swap(v);  作用相当于:    
      {   
          std::vector<T>   temp(v);    //1   
          temp.swap(v);                //2   
      }   


      第一句产生一个和v内容一模一样的vector,只不过temp的容量是恰好满足其大小的  。
      第二句把v和temp交换 ,然后temp就自动解析掉了   
        
      这样写的作用是:把v的容量缩小到最佳值,该例中执行这句时,capacity收缩到 10。

    展开全文
  • 使用swap来释放vector的内存

    千次阅读 2015-09-18 09:46:38
    先说明如何使用swap来释放 vector 的内存,然后再说明在释放过程中发生了什么。释放操作如下: void func() { vector vec(2,3); vec.swap(vector()); //该swap操作将释放原本 vector 所占用的内存 } 我们知道,...

    先说明如何使用swap来释放 vector 的内存,然后再说明在释放过程中发生了什么。释放操作如下:

    void func()
    {
    	vector<int> vec(2,3);
    	vector<int>().swap(vec);  //该swap操作将释放原本 vector 所占用的内存 
    }

    上述代码是经楼下的朋友qq_32118211 提出的一个比较严重的Bug后改正的版本,写文章的过程是我学习的过程,不见得都对,谢谢大家指出毛病,共同学习。原版错误与讨论加在文章最后。


    我们知道,vector 是使用三个指针 start,finish,end_of_storage 来对 vector 所占用的空间进行标注,其中 start,finish 分别对应 vector 的 begin() 与end() 返回值。而 vector 的swap 成员函数的代码如下:

      void swap(vector<T, Alloc>& x) {
        __STD::swap(start, x.start);
        __STD::swap(finish, x.finish);
        __STD::swap(end_of_storage, x.end_of_storage);
      }

    可以看到,vector 的 swap 成员调用了 STD::swap 分别交换双方的 start,finish,end_of_storage 指针,那我们再来看看 STD::swap 的操作:

    template<class T>
    void swap(T& a, T&b)
    {
    	T c(a);
    	a = b;
    	b = c;
    }
    可以很明显看出,STL的 swap函数的操作只是交换两个引用形参的值。

    因此,我们 vector 的 swap 函数的功能,就是交换两个容器所指向的内存空间。因此,func()函数中,vec将拥有为临时对象分配的大小为0的空间,而临时对象则将拥有原来的 vec 所占用的空间。又因为临时对象在该语句结束后就被销毁,因此,临时对象拥有的原来的 vec 的内存空间也就被随之销毁。



    附: 原版代码Bug

    void func()
    {
    	vector<int> vec(2,3);
    	vector<int>().swap(vec);   // 原本代码为: vec.swap(vector<int>());
    }

    错误版本的代码在VS2015上不会报错,在G++上会报错,报错原因:将临时对象赋给非const左值引用。至于为什么VS2015不报错,在我个人研究C++11特性过程中,发现VS2015在细节上不完全与C++11要求的特性统一  -_-  。VS2015允许非const左值引用绑定到临时对象,这是为了兼容出生在C++标准前的VC6,如果在VS中选择禁用语言扩展选项,错误的代码就会报错了。

    再次感谢提出问题的 qq_32118211  同学。。

    展开全文
  • 在《effective STL》和其实很多C++文章中都有指明,用clear()无法保证内存回收。但是swap技法可以。... vector().swap(nums); //或者nums.swap(vector()); vector().swap(nums); 或者如下所示 加
  • 利用STL函数swap进行vector内的数据交换
  • vector-swap

    2018-04-22 07:38:01
    //////////////////////////////////////// ...// vector-swap #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; template&lt;...
  • vector_swap

    2019-05-11 18:46:24
    // swap vectors #include <iostream> #include <vector> using namespace std; //通过x的内容交换容器的内容,x是另一个相同类型的向量对象。大小可能不同。 //在调用这个成员函数之后,这个容器中的...
  • swap清除vector占用内存

    千次阅读 2010-03-17 14:21:00
    vector与deque不同,其内存占用空间只会增长,不会减小。比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。所有空间在vector析构时回收。 empty()是用来...
  • 利用swap彻底清空vector

    千次阅读 2019-02-28 14:47:45
    要清空vector容器,如果仅仅使用clear是不行的,因为只是size变成了0,但容量依然是之前的值,所以可以使用swap函数巧妙的将容量也变成0,看如下代码 void freeTestClasses(vector&lt;TestClass *&gt; *...
  • vector swap函数

    2019-11-22 17:33:36
    我看 stl 介绍 vector swap 是 交换 两个vector ; //swap(vector &); vector<int> a(10,0); vector<int> b(2,2); a.swap(b); 但是为什么能交换同一个vector的值呐? vector<int> ...
  • vector 释放内存 swap

    2016-04-07 15:24:39
    ... 相信大家看到swap这个词都一定不会感到陌生,...的确,swap交换函数是仅次于Hello word这样老得不能老的词,然而,泛型算法东风,这个小小的玩意儿却在C++ STL中散发着无穷的魅力。本文不仅详细地阐述STL泛
  • vector容器的swap方法

    2020-08-05 00:28:34
    计算机中swap函数很多,比如字符串交换(swap) swap操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须匹配: 必须是相同类型的容器,而且所存储的元素类型也必须相同。调用了swap函数后,右操作数原来...
  • stl swap函数 C ++ vector :: swap()函数 (C++ vector::swap() function) vector::swap() is a library function of "vector" header, it is used to swap the content of the vectors, it is called with a vector ...
  • vector使用swap释放内存

    千次阅读 2017-02-22 21:35:27
    使用vector的时候一般会先调用reserve扩充一个比较大的容量,以免vector...只需要一条语句就可以搞定:vector(ivec).swap(ivec);又叫做收缩到合适shrink to fit另外,如果我们想强行释放vector所占的内存,那么可以:ve
  • C++ vector容器的swap方法

    千次阅读 2017-11-01 17:38:50
    使用vector.swap()方法释放内存……
  • C++ vector容器的swap方法(容器互换)

    万次阅读 多人点赞 2019-11-21 23:01:53
    swap方法可以交换两容器的内容。 int main() { vector<int> v1; v1.push_back(10); v1.push_back(20); vector<int> v2; v2.push_back(30); //printVector是自己编写用于遍历输出vector容器的...
  • 实现vectorswap函数误区

    千次阅读 2018-12-29 00:33:02
    今天coding的时候想实现vectorswap函数,刚开始是这样写的,发现调用swap后原来的vector里面的值根本没有发生改变,想了许久,才发现没有取引用,vector作为一个类,不传引用仅仅是发生拷贝构造了一个局部对象,...
  • vector的clear和swap

    2017-04-12 16:50:00
    vector的clear()操作只是清空vector的元素,而不会将内存释放掉 vector<int> vec1{ 1,2,3,4,5 }; vec1.clear(); cout<<"cap "<...使用vectorswap操作: vector<int>()...
  • std::vector g_refDtlVec; int main(){  for(int i=0;i  g_refDtlVec.push_back(i);  }    printf("sleep \n");  sleep(10); ... std::vector(g_refDtlVec).swap(g_refDtlVec

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,364
精华内容 42,945
关键字:

swapvector