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

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

时间: 2024-08-03 03:23:48

STL基础--算法(修改数据的算法)的相关文章

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

不修改数据的算法 count, min and max, compare, linear search, attribute // 算法中Lambda函数很常用: num = count_if(vec.begin(), vec.end(), [](int x){return x<10;}); bool lessThan10(int x) { return x<10; } vector<int> vec = {9,60,90,8,45,87,90,69,69,55,7}; vecto

sql_基础_修改数据

1,插入数据:INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...); INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80); 注意到我们并没有列出id字段,也没有列出id字段对应的值,这是因为id字段是一个自增主键,它的值可以由数据库自己推算出来.此外,如果一个字段有默认值,那么在INSERT语句中也可以不出现. 要注意,字段顺序不必和数

几个新角色:数据科学家、数据分析师、数据(算法)工程师

大数据分析的几个新角色:数据科学家.数据分析师.数据(算法)工程师 数学科学家:(发明算法) 运用统计分析.机器学习.分布式处理等技术,从大量数据中提取出对业务有意义的信息,以易懂的形式传达给决策者,并创造出新的数据应用服务的人才. 对享有的模型进行优化.改进,所以涉及到对具体算法的精通和理解,并不断通过AB Test进行验证. 例如:Google的搜索PageRank算法的创始人拉里佩奇Larry Page,他是博士而且在读书期间创造的此算法. 李开复也应该算一个,解决中文搜索及尝试了语音识别

STL区间成员函数及区间算法总结

STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间成员函数不适用的情况下也应该使用区间算法,至少,相比手写循环而言,它更加简单,有效,并且不容易出错: 区间成员函数 区间构造 标准容器都支持区间构造函数: container::container(InputIterator begin, // 区间的起点 InputIterator end); /

STL——配接器、常用算法使用

学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配而来.其实适配器也是一种设计模式,该种模式是将一个类的接口转换成用户希望的另外一个接口.简单的说:就是需要的东西就在眼前,但却不能用或者使用不是很方便,而短时间又无法改造它,那我们就通过已存在的东西去适配它. STL中的适配器一共有三种: ①应用于容器的即容器适配器:比如stack和queue就是对

零基础学并查集算法

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修

[转]算法的简单归类。大数据常用算法

无论是机器学习.模式识别.数据挖掘.统计学习.计算机视觉.语音识别.自然语言处理都涉及到算法. 1.树:决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法.由于这种决策分支画成图形很像一棵树的枝干,故称决策树.在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系.Entropy = 系统的凌乱程度,使用算法ID3, C4.5和

大数据算法 十大经典算法

一.C4.5 C4.5,是机器学习算法中的一个分类决策树算法, 它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法 ID3的改进算法,所以基本上了解了一半决策树构造方法就能构造它. 决策树构造方法其实就是每次选择一个好的特征以及分裂点作为当前节点的分类条件. C4.5相比于ID3改进的地方有: 1.用信息增益率来选择属性. ID3选择属性用的是子树的信息增益,这里可以用很多方法来定义信息,ID3使用的是熵(entropy,熵是一种不纯度度量准则), 也就是熵的变化

【转】STL算法 &lt;algorithm&gt;中各种算法解析

原文:http://blog.csdn.net/tianshuai1111/article/details/7674327 一,巡防算法 for_each(容器起始地址,容器结束地址,要执行的方法) #include <iostream> #include <algorithm> #include <vector> using namespace std; template<class T> struct plus2 { void operator()(T&