C++相关闲碎记录(3)

news2024/12/29 11:29:47

1、reference wrapper

例如声明如下的模板:

template <typename T>
void foo(T val);

 如果调用使用:

int x;
foo(std::ref(x));

T变成int&,而使用调用

int x;
foo(std::cref(x));

T变成const int&。

 这个特性被C++标准库用在各个地方,例如:

make_pair()用此特性于是能够创建一个pair<>of reference
make_tuple()用此特性可以创建一个tuple<>of reference 
 

std::vector<MyClass&> coll;       //error
std::vector<std::reference_wrapper<MyClass>> coll;    //ok

2、function type wrapper

#include <iostream>
#include <vector>
#include <functional>
using namespace std;

void func(int x, int y) {
    std::cout << "func" << std::endl;
}

class C {
public:
    void memfunc(int x, int y) const{
        std::cout << "C::memfunc" << std::endl;
    }
};

int main()
{
    std::vector<std::function<void(int,int)>> tasks;
    tasks.push_back(func);
    tasks.push_back([](int x, int y) {
                        std::cout << "lambda" << std::endl;
                    });
    for (std::function<void(int,int)> f : tasks) {
        f(3, 33);
    }

    std::function<void(const C&, int, int)> mf;
    mf = &C::memfunc;
    mf(C(), 2, 3);
    return 0;
}
输入:
func
lambda
C::memfunc

3、挑选最小值和最大值

auto extremes = std::minmax({px, py, pz}, [](int*a, int*b) {
                        return *a < *b;                        
                    });
两值互换:
namespace std {
    template <typename T>
    inline void swap(T& a, T& b) {
        T tmp(std::move(a));
        a = std::move(b);
        b = std::move(tmp);
    }
}

4、class ratio<>

#include <ratio>
#include <iostream>
using namespace std;

int main()
{
   typedef ratio<5,3> FiveThirds;
   cout << FiveThirds::num << "/" << FiveThirds::den << endl;

   typedef ratio<25,15> AlsoFiveThirds;
   cout << AlsoFiveThirds::num << "/" << AlsoFiveThirds::den << endl;

   ratio<42,42> one;
   cout << one.num << "/" << one.den << endl;

   ratio<0> zero;
   cout << zero.num << "/" << zero.den << endl;

   typedef ratio<7,-3> Neg;
   cout << Neg::num << "/" << Neg::den << endl;
}
输出:
5/3
5/3
1/1
0/1
-7/3

 5、duration

#include <ratio>
#include <iostream>
#include <chrono>
using namespace std;

int main()
{
   std::chrono::duration<int>                         twentySeconds(20);  //以秒为单位
   std::chrono::duration<double, std::ratio<60>>      halfAMinute(0.5);   //以60秒为单位
   std::chrono::duration<long, std::ratio<1, 1000>>   oneMillisecond(1);  //以1/1000秒为单位

   std::chrono::seconds         twentySeconds(20);
   std::chrono::hours           aDay(24);
   std::chrono::milliseconds    oneMillisecond(1);
}

// 将毫秒单位的duration切割为小时,分钟,秒,毫秒 

#include <ratio>
#include <iostream>
#include <chrono>
#include <iomanip>
using namespace std;
using namespace std::chrono;

milliseconds ms(7255042);

template <typename V, typename R>
ostream& operator<<(ostream& os, const chrono::duration<V,R>& d) {
    os << "[" << d.count() << " of " << R::num << "/" << R::den << "]";
    return os;
}

// 将毫秒单位的duration切割为小时,分钟,秒,毫秒
int main()
{
    hours hh = duration_cast<hours>(ms);
    minutes mm = duration_cast<minutes>(ms%chrono::hours(1));
    seconds ss = duration_cast<seconds>(ms%chrono::minutes(1));
    milliseconds msec = duration_cast<milliseconds>(ms%chrono::seconds(1));

    cout << "raw: " << hh << "::" << mm << "::"
         << ss << "::" << msec << endl;
    cout << "    " << setfill('0') << setw(2) << hh.count() << "::"
                                   << setw(2) << mm.count() << "::"
                                   << setw(2) << ss.count() << "::"
                                   << setw(2) << msec.count() << endl;
}
#include <ratio>
#include <iostream>
#include <chrono>
#include <iomanip>
using namespace std;
using namespace std::chrono;

template <typename C>
void printClockData ()
{
    using namespace std;

    cout << "- precision: ";
    // if time unit is less than or equal to one millisecond
    typedef typename C::period P;   // type of time unit
    if (ratio_less_equal<P,milli>::value) {
        // convert to and print as milliseconds
        typedef typename ratio_multiply<P,kilo>::type TT;
        cout << fixed << double(TT::num)/TT::den
             << " milliseconds" << endl;
    }
    else {
        // print as seconds
        cout << fixed << double(P::num)/P::den << " seconds" << endl;
    }
    cout << "- is_steady: " << boolalpha << C::is_steady << endl;
}

int main()
{
    std::cout << "system_clock: " << std::endl;
    printClockData<std::chrono::system_clock>();
    std::cout << "\nhigh_resolution_clock: " << std::endl;
    printClockData<std::chrono::high_resolution_clock>();
    std::cout << "\nsteady_clock: " << std::endl;
    printClockData<std::chrono::steady_clock>();
}
输出:
system_clock: 
- precision: 0.000001 milliseconds
- is_steady: false

high_resolution_clock:
- precision: 0.000001 milliseconds
- is_steady: false

steady_clock:
- precision: 0.000001 milliseconds
- is_steady: true

下面的程序将timepoint赋值给tp,并转换为日历表示法,window运行会报错,LInux下运行正常:

#include <chrono>
#include <ctime>
#include <string>
#include <iostream>

std::string asString (const std::chrono::system_clock::time_point& tp)
{
    // convert to system time:
    std::time_t t = std::chrono::system_clock::to_time_t(tp);
    std::string ts = std::ctime(&t);    // convert to calendar time
    ts.resize(ts.size()-1);             // skip trailing newline
    return ts; 
}

int main()
{
    // print the epoch of this system clock:
    std::chrono::system_clock::time_point tp;
    std::cout << "epoch: " << asString(tp) << std::endl;

    // print current time:
    tp = std::chrono::system_clock::now();
    std::cout << "now:   " << asString(tp) << std::endl;

    // print minimum time of this system clock:
    tp = std::chrono::system_clock::time_point::min();
    std::cout << "min:   " << asString(tp) << std::endl;

    // print maximum time of this system clock:
    tp = std::chrono::system_clock::time_point::max();
    std::cout << "max:   " << asString(tp) << std::endl;
}
输出:
epoch: Thu Jan  1 08:00:00 1970
now:   Thu Nov 30 21:29:29 2023
min:   Tue Sep 21 08:18:27 1677
max:   Sat Apr 12 07:47:16 2262
#include <chrono>
#include <ctime>
#include <iostream>
#include <string>
using namespace std;

string asString (const chrono::system_clock::time_point& tp)
{
    time_t t = chrono::system_clock::to_time_t(tp); // convert to system time
    string ts = ctime(&t);                          // convert to calendar time
    ts.resize(ts.size()-1);                         // skip trailing newline
    return ts; 
}

int main()
{
    // define type for durations that represent day(s):
    typedef chrono::duration<int,ratio<3600*24>> Days;

    // process the epoch of this system clock
    chrono::time_point<chrono::system_clock> tp;
    cout << "epoch:     " << asString(tp) << endl;

    // add one day, 23 hours, and 55 minutes
    tp += Days(1) + chrono::hours(23) + chrono::minutes(55);
    cout << "later:     " << asString(tp) << endl;

    // process difference from epoch in minutes and days:
    auto diff = tp - chrono::system_clock::time_point();
    cout << "diff:      "
         << chrono::duration_cast<chrono::minutes>(diff).count()
         << " minute(s)" << endl;
    Days days = chrono::duration_cast<Days>(diff);
    cout << "diff:      " << days.count() << " day(s)" << endl;

    // subtract one year (hoping it is valid and not a leap year)
    tp -= chrono::hours(24*365);
    cout << "-1 year:   " << asString(tp) << endl;

    // subtract 50 years (hoping it is valid and ignoring leap years)
    tp -= chrono::duration<int,ratio<3600*24*365>>(50);
    cout << "-50 years: " << asString(tp) << endl;

    // subtract 50 years (hoping it is valid and ignoring leap years)
    tp -= chrono::duration<int,ratio<3600*24*365>>(50);
    cout << "-50 years: " << asString(tp) << endl;
}
输出:
epoch:     Thu Jan  1 08:00:00 1970
later:     Sat Jan  3 07:55:00 1970
diff:      2875 minute(s)
diff:      1 day(s)
-1 year:   Fri Jan  3 07:55:00 1969
-50 years: Thu Jan 16 07:55:00 1919
-50 years: Wed Jan 27 08:00:43 1869

 6、timepoint与日历时间的转换

#include <chrono>
#include <ctime>
#include <string>
#include <iostream>

// convert timepoint of system clock to calendar time string
inline std::string asString(const std::chrono::system_clock::time_point& tp) {
    std::time_t t = std::chrono::system_clock::to_time_t(tp);
    std::string ts = ctime(&t);  // convert to calendar time
    ts.resize(ts.size()-1);      //skip trailing newline
    return ts;
}

// convert calender time to timepoint of system clock
inline std::chrono::system_clock::time_point
makeTimePoint(int year, int mon, int day, int hour, int min, int sec=0) {
    struct std::tm t;
    t.tm_sec = sec;
    t.tm_min = min;
    t.tm_hour = hour;
    t.tm_mday = day;
    t.tm_mon = mon - 1;
    t.tm_year = year-1900;
    t.tm_isdst = -1;
    std::time_t tt = std::mktime(&t);
    if (tt == -1) {
        throw "no valid system time";
    }
    return std::chrono::system_clock::from_time_t(tt);
}

int main() {
    auto tp1 = makeTimePoint(2023, 11, 30, 00, 00);
    std::cout << asString(tp1) << std::endl;

    auto tp2 = makeTimePoint(2023, 03, 23, 12, 33);
    std::cout << asString(tp2) << std::endl;
    return 0;
}
输出:
Thu Nov 30 00:00:00 2023
Thu Mar 23 12:33:00 2023

7、<cstring>中的定义式

//在ptr所指的前len个byte中找出字符c
memchr(const void* ptr, int c, size_t len)

//比较ptr1和ptr2所指的前len个byte
memcmp(const void* ptr1, const void* ptr2, size_t len)

//将fromPtr所指的前len个byte复制到toPtr
memcpy(void* toPtr, const void* fromPtr, size_t len)

//将fromPtr所指的前len个byte复制到toPtr(区域可重叠)
memmove(void* toPtr, const void* fromPtr, size_t len)

//将ptr所指的前len个byte赋值为字符c
memset(void* ptr, int c, size_t len)

 8、algorithm

(1)find
#include <algorithm>
#include <list>
#include <iostream>
using namespace std;

int main()
{
    list<int> coll;

    // insert elements from 20 to 40
    for (int i=20; i<=40; ++i) {
        coll.push_back(i);
    }

    // find position of element with value 3
    // - there is none, so pos3 gets coll.end()
    auto pos3 = find (coll.begin(), coll.end(),    // range
                      3);                          // value
    
    // reverse the order of elements between found element and the end
    // - because pos3 is coll.end() it reverses an empty range
    reverse (pos3, coll.end());

    // find positions of values 25 and 35
    list<int>::iterator pos25, pos35;
    pos25 = find (coll.begin(), coll.end(),  // range
                  25);                       // value
    pos35 = find (coll.begin(), coll.end(),  // range
                  35);                       // value

    // print the maximum of the corresponding range
    // - note: including pos25 but excluding pos35
    cout << "max: " << *max_element (pos25, pos35) << endl;

    // process the elements including the last position
    cout << "max: " << *max_element (pos25, ++pos35) << endl;
}
(2)find_if

查找最先出现的25或者35

#include <algorithm>
#include <list>
#include <iostream>
using namespace std;

int main()
{
    list<int> coll;

    // insert elements from 20 to 40
    for (int i=20; i<=40; ++i) {
        coll.push_back(i);
    }

    auto pos = find_if(coll.begin(), coll.end(),
                        [](int i) {
                            return i == 25 || i == 35;
                        });
    if (pos == coll.end()) {
        std::cout << "not found" << std::endl;
        exit(1);
    }
    list<int>::const_iterator pos25, pos35;
    if (*pos == 25) {
        // 先找到25
        pos25 = pos;
        pos35 = find(++pos, coll.end(), 35);
        std::cout << *pos35 << std::endl;
    } else {
        pos35 = pos;
        pos25 = find(++pos, coll.end(), 25);
        std::cout << *pos25 << std::endl;
    }
}

9、insert iterator

#include <algorithm>
#include <list>
#include <vector>
#include <set>
#include <iterator>
#include <deque>
#include <iostream>
using namespace std;

int main()
{
    list<int> coll1 = {1, 2, 3, 4, 5, 6, 7, 8};
    vector<int> coll2;

    copy(coll1.begin(), coll1.end(), back_inserter(coll2));

    deque<int> coll3;
    copy(coll1.begin(), coll1.end(), front_inserter(coll3));

    set<int> coll4;
    copy(coll1.begin(), coll1.end(), inserter(coll4, coll4.begin()));

    for (auto &ele : coll2) {
        std::cout << ele << " ";
    }
    std::cout << std::endl;
    for (auto &ele : coll3) {
        std::cout << ele << " ";
    }
    std::cout << std::endl;
    for(auto & ele : coll4) {
        std::cout << ele << " ";
    }
}
输出:
1 2 3 4 5 6 7 8 
8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8

inserter的作用是在“初始化时接受的第二个实参”所指的位置的前面插入元素,内部调用成员函数insert(),并以新值和新位置作为实参传入,所有的STL容器都提供insert()成员函数,这是唯一可以用于关联式容器身上的一种预定义inserter。

10、stream iterator 

 

#include <algorithm>
#include <vector>
#include <iterator>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    vector<string> coll;

    // 使用ctrl+z 回车进行终止
    copy(istream_iterator<string>(cin), 
         istream_iterator<string>(),
         back_inserter(coll));

    sort(coll.begin(), coll.end());

    unique_copy(coll.cbegin(), coll.cend(), 
                ostream_iterator<string>(cout, "\n"));
}

11、reverse iterator 

#include <algorithm>
#include <vector>
#include <iterator>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    vector<int> coll;

    for (int i = 1; i <= 9; i++) {
        coll.push_back(i);
    }

    copy(coll.crbegin(), coll.crend(), 
         ostream_iterator<int>(cout, " "));
}
输出:
9 8 7 6 5 4 3 2 1 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1277379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】Rabin-Karp 算法

目录 1.概述2.代码实现3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 有关字符串模式匹配的其它算法&#xff1a; 【算法】Brute-Force 算法 【算法】KMP 算法 1.概述 &#xff08;1&#xff09;Rabin-Karp 算法是由 Richard M. Karp 和 Michael O. R…

基于ASP.NET MVC技术的图书管理系统的设计与实现

基于ASP.NET MVC技术的图书管理系统的设计与实现 摘要&#xff1a;图书管理系统是一套高新科学技术和图书知识信息以及传统历史文化完美结合的体现。它改变了传统图书收藏的静态书本式图书服务特征&#xff0c;实现了多媒体存取、远程网络传输、智能化检索、跨库无缝链接、创造…

景联文科技数据标注平台助力AI数据实现价值最大化

随着人工智能技术不断进步&#xff0c;应用领域不断拓宽&#xff0c;对于高质量、大规模标注数据的需求也在不断增加。 数据标注是人工智能行业的基石。机器学习需要运用海量的有效数据来做支撑&#xff0c;而这些数据就需要我们的标注员对其进行分析和处理&#xff0c;想要得到…

Linux Makefile的认识及CMake的使用

1 Makefile的作用 Makefile 指的是一个叫 Makefile 的文件,里面提前写了一些指令。每次要自动化的完成一个比较复杂项目的自动编译用的时候,就在命令行输入“make”命令Makefile使用。使用Makefile可以 “智能” 的知道: 1 哪些文件需要先进行编译。 2 当某一文件在某次mak…

第九节HarmonyOS 常用基础组件5-LoadingProgress

一、LoadingProgress LoadingProgress组件用于显示加载动效的组件&#xff0c;比如应用的登录界面&#xff0c;当我们点击登录的时候&#xff0c;显示的“正在登录”的进度条状态。LoadingProgress的使用非常简单&#xff0c;只需要设置颜色和宽高就可以了。 Entry Component …

可可爱爱的羽绒服,面料是三防的哦

分享女儿的时尚穿搭 粉粉嫩嫩的羽绒服 杜邦三防面料 柔软蓬松上身很舒适 超足充绒量 美观与实用性兼具 这款还有妈妈款哦&#xff01;&#xff01;

Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识&#xff0c;但是都是基于理论原理知识理解&#xff0c;今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。 索引原理过程&#xff1a;【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Surviv…

常用sql记录

备份一张表 PostgreSQL CREATE TABLE new_table AS SELECT * FROM old_table;-- 下面这个比上面好&#xff0c;这个复制表结构时&#xff0c;会把默认值、约束、注释都复制 CREATE TABLE new_table (LIKE old_table INCLUDING ALL) WITHOUT OIDS; INSERT INTO new_table SELE…

【vSphere 8 自签名 VMCA 证书】企业 CA 签名证书替换 vSphere VMCA CA 证书Ⅲ—— 颁发自签名与替换 VMCA 证书

目录 5. 使用 Microsoft 证书颁发机构颁发自签名 CA 证书链5.1 登录MADCS5.2 申请证书5.3 选择证书类型5.4 提交CR5.5 下载 Base 64 编码的证书5.6 将证书链传入VC 6. 使用 企业CA签发的 VMCA 证书 替换 vSphere 默认 VMCA 证书6.1 确认证书文件6.2 替换默认 vSphere 证书6.3 验…

【golang】为什么使用goland终端修改不了Go语言的配置环境?

问题 最近在做项目时&#xff0c;需要使用golang的交叉编译&#xff0c;在windows系统上打包一个可以在linux系统上运行的golang程序的二进制文件。 这就需要暂时修改一下golang的配置环境&#xff1a; set GOARCH amd64 set GOOS linux但是修改的时候发现在goland终端输入…

企业加密软件有哪些(公司防泄密软件)

企业加密软件是专门为企业设计的软件&#xff0c;旨在保护企业的敏感数据和信息安全。这些软件通过使用加密技术来对数据进行加密&#xff0c;使得数据在传输和存储过程中不会被未经授权的人员获取和滥用。 企业加密软件的主要功能包括数据加密、文件加密、文件夹加密、移动设备…

字营销具有成本效益的 5 个原因

任何企业的主要支出之一是他们花在营销上的钱。营销是每个企业保持对目标受众可见度并转化潜在客户的基本必要条件。品牌保持营销联盟的一种行之有效的方法是数字营销。在这个数字时代&#xff0c;对于所有希望在市场上建立品牌的企业来说&#xff0c;数字营销都是一种具有成本…

Beta冲刺随笔-DAY4-橘色肥猫

这个作业属于哪个课程软件工程A这个作业要求在哪里团队作业–站立式会议Beta冲刺作业目标记录Beta冲刺Day4团队名称橘色肥猫团队置顶集合随笔链接Beta冲刺笔记-置顶-橘色肥猫-CSDN博客 文章目录 SCRUM部分站立式会议照片成员描述 PM报告项目程序&#xff0f;模块的最新运行图片…

【halcon】裁剪

前言 目前我遇到的裁剪相关的函数都是以clip打头的函数。一共4个&#xff1a; clip_end_points_contours_xldclip_contours_xldclip_regionclip_region_rel 前面两个是对轮廓的裁剪。 后面是对区域的裁剪。 裁剪轮廓的两端 clip_end_points_contours_xld 用于实现裁剪XLD…

6.6 Windows驱动开发:内核枚举Minifilter微过滤驱动

Minifilter 是一种文件过滤驱动&#xff0c;该驱动简称为微过滤驱动&#xff0c;相对于传统的sfilter文件过滤驱动来说&#xff0c;微过滤驱动编写时更简单&#xff0c;其不需要考虑底层RIP如何派发且无需要考虑兼容性问题&#xff0c;微过滤驱动使用过滤管理器FilterManager提…

第九节HarmonyOS 常用基础组件3-TextInput

一、TextInput描述 TextInput组件用于输入单行文本&#xff0c;响应输入事件。TextInput的使用也非常广泛&#xff0c;例如应用登录账号密码、发送消息等。和Text组件一样&#xff0c;TextInput组件也支持文本样式设置&#xff0c;下面的示例代码实现了一个简单的输入框&#x…

css所有属性介绍

文章目录 1️⃣ CSS属性介绍1.1 CSS3 动画属性&#xff08;Animation&#xff09;1.2 CSS 背景属性&#xff08;Background&#xff09;1.3 CSS 边框属性&#xff08;Border 和 Outline&#xff09;1.4 Box 属性1.5 Color 属性1.6 Content for Paged Media 属性1.7 CSS 尺寸属性…

prometheus部署及与grafana结合应用

一、prometheus 介绍 prometheus server 是 Prometheus组件中的核心部分&#xff0c;负责实现对监控数据的获取&#xff0c;存储以及查询。它会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据&#xff0c;当新拉取到的数据大于配置的内存缓存区时&…

虚拟机备份数据自动化验证原理

备份数据成功备份下来了&#xff0c;但是备份数据是否可用可靠&#xff1f;对于这个问题&#xff0c;最好最可靠的方法是将备份数据实际恢复出来验证。 但是这样的方法&#xff0c;不仅费时费力&#xff0c;而且需要随着备份数据的定期产生&#xff0c;还应当定期做备份数据验…

MacDroid Pro for Mac – 安卓设备文件传输助手,实现无缝连接与传输!

想要在Mac电脑上轻松管理和传输您的安卓设备文件吗&#xff1f;MacDroid Pro for Mac 是您的最佳选择&#xff01;这款强大的文件传输助手可以让您在Mac上与安卓设备之间实现快速、方便的文件传输。 MacDroid Pro for Mac 提供了简单易用的界面&#xff0c;让您能够直接在Mac上…