move(),remove()和remove_if()
发布日期:2021-06-28 22:10:13
浏览次数:2
分类:技术文章
本文共 2091 字,大约阅读时间需要 6 分钟。
1.std::move()
函数可以以非常简单的方式将左值引用转换为右值引用。(左值、左值引用、右值、右值引用 参见:http://www.cnblogs.com/SZxiaochun/p/8017475.html)
通过std::move,可以避免不必要的拷贝操作。 std::move是为性能而生。 std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。 如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的 char 数组被析构函数释放,如果a是一个临时变量,则上面的拷贝,析构就是多余的,完全可以把临时变量a中的数据直接 “转移” 到新的变量下面即可。 #include <iostream> #include <utility> #include <vector> #include <string> int main() { std::string str = "Hello"; std::vector<std::string> v; //调用常规的拷贝构造函数,新建字符数组,拷贝数据 v.push_back(str); std::cout << "After copy, str is \"" << str << "\"\n"; //调用移动构造函数,掏空str,掏空后,最好不要使用str v.push_back(std::move(str)); std::cout << "After move, str is \"" << str << "\"\n"; std::cout << "The contents of the vector are \"" << v[0] << "\", \"" << v[1] << "\"\n"; }2.Remove()函数
remove(beg,end,const T& value) //移除区间{beg,end)中每一个“与value相等”的元素; remove只是通过迭代器的指针向前移动来删除,将没有被删除的元素放在链表的前面,并返回一个指向新的超尾值的迭代器。由于remove()函数不是成员,因此不能调整链表的长度。remove()函数并不是真正的删除,要想真正删除元素则可以使用erase()或者resize()函数。用法如下: string str1 = "Text with some spaces"; str1.erase(std::remove(str1.begin(), str1.end(), ' '), str1.end()); // "Textwithsomespaces" 函数原型: template< class ForwardIt, class T > ForwardIt remove(ForwardIt first, ForwardIt last, const T& value) { first = std::find(first, last, value); if (first != last) for(ForwardIt i = first; ++i != last; ) if (!(*i == value)) *first++ = std::move(*i); return first; } 3.Remove_if()函数 remove_if(beg, end, op) //移除区间[beg,end)中每一个“令判断式:op(elem)获得true”的元素; remove_if(remove和unique也是相同情况)的参数是迭代器,通过迭代器无法得到容器本身,而要删除容器内的元素只能通过容器的成员函 数来进行,因此remove系列函数无法真正删除元素,只能把要删除的元素移到容器末尾并返回要被删除元素的迭代器,然后通过erase成员函数来真正删除。用法如下: bool IsSpace(char x) { return x == ' '; } string str2 = "Text with some spaces"; str2.erase(remove_if(str2.begin(), str2.end(), IsSpace), str2.end()); // "Textwithsomespaces" 函数原型: template<class ForwardIt, class UnaryPredicate> ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p) { first = std::find_if(first, last, p); if (first != last) for(ForwardIt i = first; ++i != last; ) if (!p(*i)) *first++ = std::move(*i); return first; }转载地址:https://blog.csdn.net/yhc166188/article/details/79298727 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月16日 06时21分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【SAP】基本介绍
2019-04-29
内网穿透我就用uTools
2019-04-29
【设计模式】创建型模式之单例模式
2019-04-29
页面刷新时实现单选按钮radio值不变
2019-04-29
【SAP】添加用户权限
2019-04-29
如何上传项目到git仓库
2019-04-29
【AIX】AIX磁盘管理总结
2019-04-29
【python】super的用法
2019-04-29
【python】判断时间为周末类似的处理方法
2019-04-29
【PyQt实例1】图片的缩放和旋转
2019-04-29
【PyQt实例2】工具栏插入控件
2019-04-29
【PyQt实例3】设置字体,字号等格式属性
2019-04-29
【PyQt实例4】设置文体排序和对齐【转】
2019-04-29
【PyQt4 实例5】利用QPainter绘制各种图形
2019-04-29
【PyQt实例6】渐变效果
2019-04-29
【PyQt4实例7】QPainter坐标系的变换【转载】
2019-04-29
【PyQt4实例8】SVG格式图片的显示【转】
2019-04-29
【PyQt4实例9】橡皮筋线
2019-04-29
【python】列表操作
2019-04-29
搭建与suse远程连接环境
2019-04-29