c++20 的部分新概念及示例代码-Contracts,Ranges

本文介绍了C++20引入的contracts,包括preconditions、postconditions和assertions,以及Ranges库如何通过范围、视图、算法和函数式编程提升代码的可读性和可靠性。通过示例展示了如何在代码中使用这些新特性操作数据。
摘要由CSDN通过智能技术生成

C++20 引入了 contracts(契约),这是一种编程范式,它允许程序员在代码中添加先决条件(preconditions)、后置条件(postconditions)和断言(assertions)等契约,以提高代码的可读性、可维护性和可靠性。这些契约可以在编译时和运行时进行检查,有助于发现并修复潜在的错误。

以下是一些关于 C++20 中 contracts 的基本信息:

  1. 先决条件(Preconditions):在函数开始执行之前,检查输入参数的有效性或者环境条件的满足情况。如果前置条件不满足,则契约失败,程序可以选择中止执行或者采取其他处理方式。

    #include <cassert>
    
    void foo(int x) {
        assert(x > 0 && x < 100); // 先决条件
        // 函数体
    }
    

    后置条件(Postconditions):在函数执行结束时,检查函数返回值或者对象状态是否符合预期。如果后置条件不满足,则契约失败,程序可以选择中止执行或者采取其他处理方式。

    #include <cassert>
    
    int bar() {
        int result = calculate_result();
        assert(result >= 0); // 后置条件
        return result;
    }
    

    断言(Assertions):在代码中插入断言来检查某个特定条件是否满足。如果断言失败,则契约失败,程序可以选择中止执行或者采取其他处理方式。

    #include <cassert>
    
    void baz(int* ptr) {
        assert(ptr != nullptr); // 断言
        // 使用 ptr 指针
    }
    

Ranges 库,它提供了一组用于操作范围(例如容器、数组、迭代器等)的标准库组件,以更简洁、清晰和高效地处理数据。Ranges 库主要包括以下几个方面的功能和概念:

  1. 范围(Range):表示一个数据序列,可以是容器、数组、迭代器范围等。范围提供了一种统一的方式来处理数据,而不需要关心底层数据结构的具体细节。

  2. #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <ranges>
    
    int main() {
        std::vector<int> numbers = {1, 2, 3, 4, 5};
    
        // 使用范围算法对范围进行操作
        auto result = std::ranges::transform(numbers, [](int x) { return x * 2; });
    
        // 打印结果
        for (int num : result) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    
        return 0;
    }
    

  3. 视图(View):提供了一种对范围进行转换、筛选或者映射的机制,而不会修改原始数据。视图使得数据处理操作更加灵活,并且可以链式调用多个操作。

  4. 算法(Algorithm):Ranges 库包含了一系列与范围相关的算法,如查找、排序、转换等,这些算法可以直接应用于范围上,而无需手动管理迭代器。

  5. 迭代器(Iterator):Ranges 库引入了一些新的迭代器概念,如输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器等,以支持不同类型范围的操作。

  6. 函数式编程(Functional Programming):Ranges 库提供了一些函数式编程风格的操作,如映射(map)、过滤(filter)、折叠(fold)等,使得代码更加简洁和易读。

 

#include <iostream>
#include <vector>
#include <ranges>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 使用视图过滤出偶数
    auto even_numbers = numbers | std::views::filter([](int x) { return x % 2 == 0; });

    // 使用视图转换为字符串
    auto str_numbers = even_numbers | std::views::transform([](int x) { return std::to_string(x); });

    // 打印转换后的字符串
    for (const auto& str : str_numbers) {
        std::cout << str << " ";
    }
    std::cout << std::endl;

    return 0;
}

我们首先定义了一个整数数组 numbers,然后使用视图过滤出其中的偶数,再使用视图将偶数转换为字符串,并最终打印转换后的字符串。这个示例展示了如何利用 Ranges 库的功能,以一种简洁和清晰的方式操作数据。

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CTA(Commodity Trading Advisor)策略的实现需要结合市场分析、量化交易等技术。在C++中实现CTA策略,需要掌握以下知识点: 1. C++基础语法 2. C++面向对象编程思想 3. 数据结构与算法 4. 量化金融知识 下面是一个简单的CTA策略的C++代码实现,代码中包含了一些基本的量化交易函数,以及模拟市场行情的代码。 ```c++ #include <iostream> #include <vector> using namespace std; class MarketData { public: double open; double high; double low; double close; double volume; }; class CTA { public: CTA(double init_capital, double min_margin, double commission) { capital = init_capital; margin = min_margin; comm = commission; } // 计算移动平均线 double SMA(vector<double> price_list, int period) { double sum = 0; for (int i = 0; i < period; i++) { sum += price_list[i]; } return sum / period; } // 计算ATR double ATR(vector<MarketData> market_data_list, int period) { vector<double> tr_list; for (int i = 0; i < period; i++) { double tr = max(market_data_list[i].high - market_data_list[i].low, max(abs(market_data_list[i].high - market_data_list[i - 1].close), abs(market_data_list[i].low - market_data_list[i - 1].close))); tr_list.push_back(tr); } return SMA(tr_list, period); } // 策略执行 void run(vector<MarketData> market_data_list) { double atr = ATR(market_data_list, 14); for (int i = 14; i < market_data_list.size(); i++) { if (market_data_list[i].close > SMA(close_list, 20) + 2 * atr) { // 买入 double open_price = market_data_list[i].close + comm; int quantity = floor(capital / open_price / margin) * margin; capital -= open_price * quantity; position += quantity; cout << "Buy " << quantity << " contracts at " << open_price << endl; } else if (market_data_list[i].close < SMA(close_list, 20) - 2 * atr) { // 卖出 double open_price = market_data_list[i].close - comm; int quantity = floor(capital / open_price / margin) * margin; capital += open_price * quantity; position -= quantity; cout << "Sell " << quantity << " contracts at " << open_price << endl; } close_list.push_back(market_data_list[i].close); } } private: double capital; // 初始资金 double margin; // 最小保证金 double comm; // 手续费 int position = 0; // 仓位 vector<double> close_list; // 收盘价列表 }; int main() { vector<MarketData> market_data_list; // 模拟市场行情 for (double i = 1; i <= 100; i++) { MarketData market_data; market_data.open = i; market_data.high = i + 1; market_data.low = i - 1; market_data.close = i + 0.5; market_data.volume = 1000; market_data_list.push_back(market_data); } CTA cta(100000, 0.1, 10); cta.run(market_data_list); return 0; } ``` 在代码中,我们定义了一个MarketData类表示市场行情数据,一个CTA类表示CTA策略。CTA类中包含了一些量化交易函数,如计算移动平均线、ATR等,并且实现了策略执行函数run。在run函数中,根据策略条件进行买卖操作,并更仓位和资金。最后,我们通过模拟市场行情数据来测试CTA策略的执行效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值