C++
klbc
这个作者很懒,什么都没留下…
展开
-
Linux 进程间通信之 - 信号量
前言很久不用,基本概念虽然还记得,估计不会用了,做个小demo练练手。概念信号量(信号灯)本质上是一个计数器,用于协调多个进程(包括但不限于父子进程)对共享数据对象的读/写。它不以传送数据为目的,主要是用来保护共享资源(信号量、消息队列、socket连接等),保证共享资源在一个时刻只有一个进程独享。信号量是一个特殊的变量,只允许进程对它进行等待信号和发送信号操作。最简单的信号量是取值0和1的二元信号量,这是信号量最常见的形式。通用信号量(可以取多个正整数值)和信号量集方面的知识比较复杂,原创 2022-05-03 17:55:55 · 1734 阅读 · 0 评论 -
C++ - regex基础之区分表达式
今天做一个练习用到了 regex,顺便写了个小程序,代码如下 void regexTest1() { string patten{"<(.*)>(.*)</(\\1)>"}; // 前两个表达式分别为(.*), "\1"表示与第一个表达式内容相同 regex re{patten}; string str1{"<tar>nico</tar>"}; std::smatch sm;原创 2021-03-20 16:03:21 · 129 阅读 · 0 评论 -
C++基础 - union和结构体对齐
一、union我们知道,union大小是其中元素占内存最大的数据成员大小,当一个成员被赋值后,所有其他成员均失效,如下union体typedef union { long i; int k[5]; char c; int *x[5];} DATE;猜猜 sizeof(DATE)是多大呢?其实在不同平台下,结果不一样。32位:结果为2064位:结果为40因为指针在两个平台下大小不一样,而 union 中有指针数组 x二、结构体对齐如下没有原创 2021-10-22 21:04:06 · 440 阅读 · 0 评论 -
C++ - 继承与访问控制
直接上代码: // 访问控制与继承 class Base { public: void pubMem() {} void memfcn(Base &b) { b = *this; } protected: int protMem() { return 0; } private: char privMem() { return 'a'; } }; class PubDer原创 2020-11-24 22:07:00 · 132 阅读 · 0 评论 -
C++ - 面向对象(继承、虚函数和抽象基类)
基类 Quote,定义图书的编号和价格 // Quote class Quote { public: Quote() = default; Quote(const string &book, double salesPrice) : bookNo(book), price(salesPrice) {} string isbn() const { return bookNo; } virtual doub原创 2020-11-24 18:35:21 · 131 阅读 · 0 评论 -
C++ - 函数对象/可调用对象
代码://// Created by Administrator on 2020/11/23.//#ifndef CPPBASE_MYFUNCTIONOBJECT_H#define CPPBASE_MYFUNCTIONOBJECT_H#include <string>#include <iostream>using std::string;using std::istream;namespace MyFunctionObject { // str原创 2020-11-23 22:15:05 · 267 阅读 · 0 评论 -
C++ - 类型转换和二义性
类型转换: // 类型转换测试 class SmallInt { friend SmallInt operator+(const SmallInt &lhs, const SmallInt &rhs); public: SmallInt(int i = 0) : val(i) {} explicit operator bool() { return bool(val); } operator in原创 2020-11-23 15:58:31 · 377 阅读 · 1 评论 -
C++ - MyHasPtr (编译器到底做了啥优化,细品)
头文件(包含实现,无源文件)://// Created by Administrator on 2020/11/21.//#ifndef CPPBASE_MYHASPTR_H#define CPPBASE_MYHASPTR_H#include <string>#include <iostream>#include <utility>using std::string;using std::cout;using std::endl;nam原创 2020-11-21 22:28:50 · 95 阅读 · 1 评论 -
C++ - MyFolderAndMessage
头文件://// Created by Administrator on 2020/11/21.//#ifndef CPPBASE_MYFOLDERANDMESSAGE_H#define CPPBASE_MYFOLDERANDMESSAGE_H#include <set>#include <string>using std::string;namespace MyFolderAndMessage { class Folder; cla原创 2020-11-21 18:36:41 · 118 阅读 · 0 评论 -
C++基础 - 实现一个string的vector(类标准库行为,当前仅仅实现了push_back接口)
头文件://// Created by Administrator on 2020/11/20.//#ifndef CPPBASE_MYSTRVEC_H#define CPPBASE_MYSTRVEC_H#include <memory>#include <utility>#include <iostream>using namespace std;namespace MyStrVecSpace { class MyStrVec {原创 2020-11-21 16:28:32 · 359 阅读 · 0 评论 -
C++ - regex使用基础
使用正则表达式 // regex构造,赋值,重新初始化 string partten1{"[[:alpha:]]*[^c]ei[[:alpha:]]*"}; regex r1(partten1); regex r2; r2 = r1; r1.assign(r2); auto subExprNum = r1.mark_count(); // 子表达式的数量 // 应用实例1 string str1{"receipt freind th原创 2020-08-21 22:46:32 · 1050 阅读 · 0 评论 -
C++ - 类成员初始化的一次实践
在做LeetCode208. 实现 Trie (前缀树)的时候,第一次提交速度上仅仅比C++ 23.7%的人快,感觉有点问题,会过初步分析了下,发现前缀树节点 TrieNode 的初始化实现有问题,严格来说,第一次的实现不是初始化,而是赋值,具体代码如下struct TrieNode { TrieNode():count(0) { for(auto& p : next) { p = nullptr; } } ...原创 2020-08-15 20:57:17 · 362 阅读 · 0 评论 -
C++基础 - IO格式化
标准库定义了一组操纵符来修改流的格式状态,一个操纵符是一个函数或是一个对象,会影响流的状态,当操纵符改变流的格式状态时,通常改变后的状态对所有后续IO都生效。也有例外,比如endl。控制布尔值格式 // 控制布尔值格式 bool truev = true; bool falsev = false; cout << truev << " , " << falsev << endl; cout << ..原创 2020-08-14 21:44:41 · 366 阅读 · 0 评论 -
C++基础 - string流
istringstream 从string读取数据, ostringstream 向string写入数据,stringstream兼具二者。string流对象中保存一个string对象的副本。// 个人信息类class PersonInfo {public: long long id; string name; vector<string> phones;}; // istringstream 使用实例1,处理输入一行数据中的复合信息 stri原创 2020-08-08 22:01:57 · 422 阅读 · 0 评论 -
C++基础 - IO文件流
使用文件流对象 const string filePath{"D:\\LearnProject\\data\\"}; // 直接构造且以读取模式打开文件 ifstream if1(filePath + "FileData.txt"); string line; vector<string> strvec; if( if1 ) { // 这种判断方法和基本IO流一致 getline(if1, line); strv原创 2020-08-08 21:16:38 · 135 阅读 · 0 评论 -
C++基础 - IO对象(流对象)状态,置位与复位
IO对象(流对象)不能拷贝和赋值,只能以引用的方式传递和返回 // IO对象(流对象)不能拷贝和赋值,只能以引用的方式传递和返回 ofstream out1, out2; out1 = out2; // 错误,不能对流对象赋值 ofstream print(ofstream); // 错误,不能初始化流对象参数 out2 = print(out2); // 错误,不能拷贝流对象IO对象(流对象)状态确定一个流对象的状态的最简单方法是将它当作一个条件来使用,原创 2020-08-07 22:07:13 · 1383 阅读 · 1 评论 -
C++基础 - 智能指针 weak_ptr 用途之核查指针类
weak_ptr 是一种不控制所指向对象生存期的智能指针,它指向有一个 shared_ptr 管理的对象。将一个 weak_ptr 绑定到 shared_ptr 不会改变 shared_ptr 的引用计数。一旦最后一个指向对象的shared_ptr 被销毁,对象就会被释放。即使有 weak_ptr 指向对象,对象也还是会被释放。因此不能直接用 weak_ptr 访问对象,而必须调用 lock 检查其指向的对象是否仍存在。如果存在,lock 返回一个指向共享对象的 shared_ptr。因此,只要此 s.原创 2020-07-25 21:51:46 · 252 阅读 · 0 评论 -
C++基础 - 智能指针 unique_ptr 的常见错误用法
直接上代码,如下。void UniquePtrTest2() { using intup = unique_ptr<int>; int ix = 1024, *pi = &ix, *pi2 = new int(2048); intup p0(ix); // 错误,尝试将栈上的变量赋值给unique_ptr { intup p1(pi); // 错误,会尝试delete pi指向的栈上的变量ix } i原创 2020-07-25 20:26:56 · 831 阅读 · 0 评论 -
C++基础 - 智能指针 unique_ptr 简介
unique_ptr “拥有” 它所指向的对象,与 shared_ptr 不同,某个时刻只能有一个 unique_ptr 指向一个给定的对象。当 unique_ptr 被销毁时,它所指向的对象也被销毁。// 不能拷贝unique_ptr有一个例外,我们可以拷贝或者赋值一个将要被销毁的unique_ptrunique_ptr<int> clone1(int n) { return unique_ptr<int>(new int(n));}unique_ptr<原创 2020-07-25 16:36:48 · 138 阅读 · 0 评论 -
C++基础 - 智能指针 shared_ptr 和 new 结合使用
// shared_ptr 和内置指针结合使用,慎重void process(shared_ptr<int> ptr) { cout << *ptr << endl;}void SharedPtrTest3() {// shared_ptr<int> p1 = new int(1024); // 错误,explicit构造函数,不能进行隐式转换 shared_ptr<int> p2(new int(1024)).原创 2020-07-25 15:39:50 · 440 阅读 · 0 评论 -
C++基础 - 默认初始化
默认情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型的对象值将是未定义的,而类类型对象将采用默认构造函数进行初始化。 // 默认初始化 int i; int *pi = new int; // 默认初始化,采用默认构造函数,内置类型无默认构造,值不确定 string str; string *pstr = new string; // 默认初始化,采用默认构造函数,初始化为空字符"" // 内置类型:值初始化 int i2{};原创 2020-07-25 14:48:45 · 332 阅读 · 0 评论 -
C++基础 - 智能指针 shared_ptr 实现不同对象内存共享
动态内存实现多个对象共享相同的底层数据,使用shared_ptr实现// 动态内存实现多个对象共享相同的底层数据,使用shared_ptr实现class StrBlob {public: using size_type = vector<string>::size_type; StrBlob():data(make_shared<vector<string>>()){} StrBlob(initializer_list<strin原创 2020-07-25 11:12:31 · 914 阅读 · 0 评论 -
C++基础 - 智能指针 shared_ptr 的引用计数
智能指针shared_ptr的引用计数,详见代码及说明 // shared_ptr的几种初始化方式 shared_ptr<int> p1; // null shared_ptr<string> p2 = make_shared<string>(); // 非null, 调用string默认构造函数 if(p2 && p2->empty()) { *p2 = "hello world"; }原创 2020-07-20 22:43:37 · 3247 阅读 · 0 评论 -
C++基础 - 现代C++枚举
枚举定义C++枚举类型分为限定作用域类型和不限定作用域类型,现代C++(c++11及以后)支持限定作用域类型枚举。enum colors{red, green, yellow}; // 正确,不限定作用域enum mycolors{red, green, yellow}; // 错误,不限定作用域 重复定义enum class myColors{red, green, yellow}; // 正确,限定作用域,使用class或者struct枚举类型1. enum是由某种整数类型表示的,原创 2020-07-16 22:55:26 · 405 阅读 · 0 评论