Tag: 程序设计

简易教程: C++的智能指针

C++ 智能指针教程 C++ 中的智能指针提供了自动且安全的内存管理。它们通过 RAII(资源获取即初始化)机制,帮助开发者避免内存泄漏和悬空指针的问题,确保对象在生命周期结束时被正确释放。 本教程将介绍 C++ 中三种主要的智能指针: std::unique_ptr:独占式所有权 std::shared_ptr:共享式所有权 std::weak_ptr:非拥有式弱引用 1. std::unique_ptr unique_ptr 拥有独占所有权。一个资源只能被一个 unique_ptr 拥有。 示例:管理简单对象 #include <iostream> #include <memory> int main() { std::unique_ptr<int> p = std::make_unique<int>(42); …

力扣刷题打卡2209天竟然断了, 哎

坚持6年的力扣刷题打卡作天断了。昨天开了一整天brainstorming 晚上陪媳妇过生日。然后就给忘了,还好的是力扣国服还没断。 2019年3月2日 我在美国通用电气午休的时候太无聊 拿起IPAD就刷了一题。 谁曾想:这一刷就是2209天。这六年时过境迁,很多事情物是人非。我也从美国通用电气GE(General Electric)到亚马逊 Amazon AWS 再到现在的微软剑桥研究院MSRC。 力扣每日一题打卡是可以补签的,只需要花70点积分就可以 Time Travel 回到本月补上一签。只不过那个墙是补不了的,没刷就是空的。 力扣美服是可以同步到国服的,但是目前是没有办法反过来把国服的刷题记录复制一份到美服的。可能,这就是注定的吧,肯定会有不完美的。还好我不是处女座,这么一点不完美不会逼疯我的,哈哈。我还是会继续刷题的。刷题努力提升自己,好处多多。 本文一共 348 个汉字, 你数一下对不对. 力扣刷题打卡2209天竟然断了, 哎. (AMP 移动加速版本) 赞赏我的几个理由. ¥ 打赏支持 扫描二维码,分享本文到微信朋友圈

教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型

视频:油管/Youtube | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书 马斯克的x.ai到年底有免费的25美元的credit可以使用Grok大语言模型 前不久(今年初),伊隆·马斯克/Elon Musk的X公司开源了Grok大语言模型,并且给免费提供了25美元的credit可以调用。可以在其官网x.ai注册一个帐号,申请API KEY即可,官网还贴心的的给出了调用的例子。 curl https://api.x.ai/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer xai-......" -d '{ "messages": …

基于P站(Poloniex)的广度优先搜索算法来获得任意两种币的兑换价格

币圈的P站是Poloniex,前几年被孙宇晨收购了,它是一个交易所。我很久之前用过Poloniex,当时对其印象并不是很好。 不过,现在我对其好感增加,因为币安买下的coinmarketcap免费的接口就很多限制。 官方文档),这个接口的频率限制是一秒200次,很慷慨了。 https://api.poloniex.com/markets/price 能返回所有交易配对,比如这样的: 这个JSON返回的结构是一个数组,每个元素是个结构体,也就是一个币价的具体配对信息,我们可以看成是一条边Edge两个顶点Vertice,这样就是一个图结构(带权图 Weighted Graph,权值就是兑换价格),虽然给的是单边,但其实是个双向的,比如USD_BTC得值可以反过来推得BTC到USD的价格。我们可以设计一个算法,从币价A到币价B,可以通过BFS广度优先搜索算法来获取价格。比如有配对A_B、B_C、C_D我们就可以获得A_D的值。 深度优先搜索算法DFS也可以,不过这个算法会返回找到的第一条路径,并不能保证是最短的,最短的确实是最准确的,因为链也长,转换精度就会下降。 当然,可能存在多条路径,最理想的状态是把这些路径都求出来,取个平均啥的,不过这样就得暴力搜索所有的路径了,算法时间复杂度就会比较高。 以下是BFS广度优先算法的代码,Javascript的,可以用于网页前端或者NodeJs后端,甚至是CloudFlare Serverless Worker或者是其它无服务框架:Azure Function、AWS Lambda等。 const fetch = require('node-fetch'); async function getTicker(a, b) { try { const response = …

C++的异步编程: std::future, std::async 和 std::promise

在 C++ 中,std::future 和 std::async 是 C++11 标准 并发库的一部分。它们允许您异步/Asynchronous运行任务并在稍后获取结果,非常适合编写非阻塞代码和并行化计算。以下是它们的工作原理和典型用法。 C++ std::async std::async 是一个高级函数,允许您异步启动一个任务(一个可调用对象,如函数或 lambda)。您指定要运行的函数,std::async 返回一个表示该 函数结果的 std::future。您可以稍后获取该结果,无论是任务完成时还是您需要时。 #include <iostream> #include <future> #include <chrono> int compute() { std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟工作 …

我在STEEM区块链上办的银行业务之: SP租赁服务

我打算写几篇文章来分享这些年来我在STEEM区块链上的一些有趣玩法。我是在2016年8月20日首次注册STEEM账号 @justyy 的(至今已有8.2年),后来发现区块链真的很有趣,特别适合程序员,因为它开放、透明、强大并且充满自由。 我还有一个外号“行长”,这个称号源于我在STEEM上创建了第一个银行。最初,我的业务是收取存款并支付利息,后来逐渐扩展到了代币兑换服务等。存折腾,用爱发电,(扣掉每个月昂贵的服务器运维成本)基本不挣钱,就交个朋友.jpg 在2018年2月25日(至今6.7年)我成为了STEEM见证人/Witness,也就是出块打包的矿工。一路走来,从2020年3月18日左右开始进入全球前20名,并一直保持未掉出前20,甚至长期位居STEEM见证人排行榜的首位,目前排名第二。STEEM区块链采用的共识算法是DPOS,即 Delegated Proof of Stake / 委托权益证明算法。 今天我要分享的是今年8月1日左右我推出的一项服务。当时我在村里跑步,一边跑步一边构思。回家后,我当天加隔天写好了代码,测试完毕后上线。 SP租赁服务 在STEEM区块链上,有STEEM和SBD两种代币/Token,SBD(Steem Dollar)是锚定1美元的代币,而STEEM目前约值0.16美元。区块链上的代币主要用于激励,例如奖励矿工、点赞文章获得收益等。 STEEM可以锁定(Stake)成Steem Power(解锁需要4周)。锁定的能量越多,账号的权力越大,比如投票权和点赞能力。我的SP租赁服务的原理非常简单:用户先将利息(STEEM)转账到账号@rentsp,并在备注(MEMO)中注明租赁天数。程序会计算所需的SP并自动借给指定账号。查看当前的借款人。 这是预付利息的形式,用户先支付利息,区块链上没有退款功能,资金到账后不可逆转。当SP代理(租出)后,借款人仅在取消代理前拥有使用权。等到期后,程序会自动收回SP代理。这遵循STEEM区块链的规则(代码即法律,Code is Law),因此不必担心用户卷款跑路。 用户A将SP借给用户B,用户B仅拥有SP的使用权。用户A可以随时收回借出的SP,完全不必担心资金的丢失。这就好比用户A把一只会下蛋的母鸡借给用户B,用户B在租借期间只能获取母鸡下的蛋,而用户A随时可以收回这只母鸡。 由于STEEM目前没有智能合约,理论上我是可以卷款跑路的,但不值得为了些许利息而影响长期信用。我在STEEM上活跃多年,各项指标如声誉(Reputation)、见证人排名和STEEM POWER(可直接借出的资金)等都较强。 上线三个月来,该服务累计使用49次,总共收取利息XXXX个STEEM。没多少,用爱发电/折腾。这算不上是被动收入,因为每隔几天才会有一单,好在不需要太多的维护。 有兴趣的可以查看详情:STEEM区块链SP租赁服务 STEEM高利贷? 2024年底,比特币突破了10万美元,带动了USDT的借贷利率上涨,因为投资者想要购买BTC大饼通常需要用到USDT。或许是受到这一趋势的影响,STEEM也迎来了一波上涨行情,虽然持续时间并不长,仅仅维持了几天。当STEEM连续几天超过0.25美元的时候,写文章的收益会有SBD/Steem Dollars,因为SBD长年一直是溢价的状态,当前一个SBD价格为3.2美元。当STEEM价格高的时候,会刺激人们借STEEM来Power Up/锁定,写文章,因为这样的收益很多。 …

C++的 map 当键(Key)不存在的时候会发生什么?

在面试流程(例如筛选)的早期阶段,一位 Google 招聘人员曾向我问过这个问题。 在C++中,当你使用std::map访问一个不存在的键时,行为取决于你是如何访问它的。 使用下标操作符 访问时 如果键不存在,std::map 会默认插入一个该键的元素,并为其赋值为类型的默认值。比如,如果 map 的值类型是 int,那么它会插入该键并赋值为 0。 例子: std::map<int, int> myMap; int value = myMap; // 如果键10不存在,会插入myMap = 0 使用 at() 方法访问时 如果键不存在,at() 会抛出 …