码迷,mamicode.com
首页 > 编程语言 > 详细

STL基础--算法(修改数据的算法)

时间:2019-01-01 00:55:53      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:数据   修改   next   顺序   随机   定义   unique   ora   orm   

修改元素的算法

  • 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()); 
// 更好的随机数发生器

STL基础--算法(修改数据的算法)

标签:数据   修改   next   顺序   随机   定义   unique   ora   orm   

原文地址:https://www.cnblogs.com/logchen/p/10203919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!