zoukankan      html  css  js  c++  java
  • STL基础--算法(修改数据的算法)

    修改元素的算法

    • copy, move, transform, swap, fill, replace, remove
    vector<int> vec = {9,60,70,8,45,87,90};     // 7 items
    vector<int> vec2 = {0,0,0,0,0,0,0,0,0,0,0}; // 11 items
    vector<int>::iterator itr, itr2;
    pair<vector<int>::iterator, vector<int>::iterator> pair_of_itr;
    

    1 拷贝

    copy(vec.begin(), vec.end(), // Source
    	  vec2.begin());          // Destination
    
    copy_if(vec.begin(), vec.end(),      // Source
    		  vec2.begin(),                // Destination
    		  [](int x){ return x>80;});   // Condition 
    // vec2: {87, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    
    copy_n(vec.begin(),  4, vec2.begin());  
    // vec2: {9, 60, 70, 8, 0, 0, 0, 0, 0, 0, 0}
    
    copy_backward(vec.begin(),  vec.end(),  // Source
    		        vec2.end());              // Destination 
    // vec2: {0, 0, 0, 0, 9, 60, 70, 8, 45, 87, 90}
    

    2 移动

    vector<string> vec = {"apple", "orange", "pear", "grape"}; // 4 items
    vector<string> vec2 = {"", "", "", "", "", ""};            // 6 items
    
    move(vec.begin(), vec.end(), vec2.begin());
    // vec:  {"", "", "", ""}  // Undefined
    // vec2: {"apple", "orange", "pear", "grape", "", ""};
    //
    // 如果元素类型定义了移动语义,元素会移动过去
    // 否则拷贝,相当于是copy().
    
    move_backward(vec.begin(), vec.end(), vec2.end());
    // vec2: {"", "", "apple", "orange", "pear", "grape"};
    
    vector<int> vec = {9,60,70,8,45,87,90};     // 7 items
    vector<int> vec2 = {9,60,70,8,45,87,90};     // 7 items
    vector<int> vec3 = {0,0,0,0,0,0,0,0,0,0,0}; // 11 items
    

    3 转换

    transform(vec.begin(), vec.end(),    // Source
    		    vec3.begin(),              // Destination
    			 [](int x){ return x-1;});  // Operation 
    
    transform(vec.begin(), vec.end(),           // Source #1
              vec2.begin(),                     // Source #2
    		    vec3.begin(),                     // Destination
      	       [](int x, int y){ return x+y;});  // Operation
             // 将vec和vec2的元素相加存到vec3中
             // vec3[0] = vec[0] + vec2[0]
             // vec3[1] = vec[1] + vec2[1]
             // ...
    

    4 交换--双向拷贝

    swap_ranges(vec.begin(), vec.end(), vec2.begin());
    

    5 填充

    vector<int> vec = {0, 0, 0, 0, 0};
    
    fill(vec.begin(), vec.end(), 9); // vec: {9, 9, 9, 9, 9}
    
    fill_n(vec.begin(), 3, 9);       // vec: {9, 9, 9, 0, 0}
    
    generate(vec.begin(), vec.end(), rand);     // 函数生成的值填充
    
    generate_n(vec.begin(), 3, rand); 
    

    6 替换

    replace(vec.begin(), vec.end(),  // 替换的范围
    		  6,                       // 替换的旧值
    		  9);                      // 新值                 
    
    replace_if(vec.begin(), vec.end(),     // 替换的范围
    			  [](int x){return x>80;},    // 旧值替换的条件
    			  9);                         // 新值                    
    
    replace_copy(vec.begin(), vec.end(),  // 源
    			  vec2.begin(),              // 目的
    			  6,                         // 旧值
    			  9);                        // 新值                   
      // 通用形式: replace_copy_if()
    

    7 删除

    remove(vec.begin(), vec.end(), 3);   // 删除值
    remove_if(vec.begin(), vec.end(), [](int x){return x>80;});  
    	 // 满足条件删除
    
    remove_copy(vec.begin(), vec.end(),  // Source
    		      vec2.begin(),            // Destination
    				6);                      // Condition 
       // 将剩余的元素拷贝到vec2
       // 通用形式: remove_copy_if()
    
    unique(vec.begin(), vec.end());   // 删除连续的相等的值
    
    unique(vec.begin(), vec.end(), less<int>());   
            // 前一个元素与当前元素满足谓词条件的,删除当前元素
    
    unique_copy(vec.begin(), vec.end(), vec2.begin());   
    // 删除连续重复的元素,剩余的拷贝
    // 通用形式: unique_copy()
    

    改变顺序的算法

    • reverse, rotate, permute, shuffle
    vector<int> vec =  {9,60,70,8,45,87,90};     // 7 items
    vector<int> vec2 = {0,0,0,0,0,0,0};     // 7 items
    

    1 反转

    reverse(vec.begin()+1, vec.end()-1);
    // vec: {9,87,45,8,70,60,90};     // 7 items
    
    reverse_copy(vec.begin()+1, vec.end()-1, vec2.begin());
    // vec2: {87,45,8,70,60,0,0};     
    

    2 旋转

    // 前面的元素依次移到最后,直到指定的元素成为第一个元素
    rotate(vec.begin(), vec.begin()+3, vec.end());
    // vec: {8,45,87,90,9,60,70};     // 7 items
    
    rotate_copy(vec.begin(), vec.begin()+3, vec.end(),  // Source
    		 vec2.begin());                               // Destination
           // 旋转后的结果拷贝到vec2
           // vec不变
    

    3 置换

    next_permutation(vec.begin(), vec.end()); 
                               //字典序下一个排列
    prev_permutation(vec.begin(), vec.end()); 
                               //字典序上一个排列
    // {1,2,3,5} < {1,2,4,4}
    // {1,2}     < {1,2,3}
    
    //递增排序:  {8, 9, 45, 60, 70, 87, 90} 
    //                            - 字典序最小
    //
    //递减排序: {90, 87, 70, 60, 45, 9, 8} 
    //                            - 字典序最大
    
    // 通用的版本: next_permutation(), prev_permutation()
    

    4 打乱

    //每个元素随机选择一个元素交换
    random_shuffle(vec.begin(), vec.end());
    random_shuffle(vec.begin(), vec.end(), rand);
    
    // C++ 11
    shuffle(vec.begin(), vec.end(), default_random_engine()); 
    // 更好的随机数发生器
    
  • 相关阅读:
    Node js 入门指南(1)
    书单
    JavaScript
    Web框架的本质
    Linux运维面试(填空题)
    Ubuntu更换国内源
    动态路由-OSPF
    CentOS7安装桌面环境
    anaconda系统安装&kickstart文件
    Tomcat之分布式session共享(MSM)
  • 原文地址:https://www.cnblogs.com/logchen/p/10203919.html
Copyright © 2011-2022 走看看