C++11:常用語法匯總

目錄

  • 🍁統一的列表初始化 { }
    • initializer_list
  • 🍁decltype 推導表達式類型
  • 🍁可變參數模板
    • 解析可變參數包
      • 方法一
      • 方法二
  • 🍁lambda 表達式
    • 捕捉列表的使用
    • 運用場景舉例
    • lambda表達式 與 函數對象

🍁統一的列表初始化 { }

在 C++98 標準中,花括號 { } 可以對數組、結構體元素進行同一的初始化處理:

struct Point
{int _x;int _y;
};int main()
{int arr[] = { 1, 2, 3, 4, 5 }; //初始化數組char str[] = { "hello world" };Point p = { 1, 2 };return 0;
}

時間來到 C++11 的時候,就擴大了花括號 { } 列表的使用范圍。

花括號 { } 可以用來所有的內置類型自定義類型;簡單的來說就是可以用花括號來初始化一切變量,并且可以省略賦值符號。

struct Point
{int _x;int _y;
};int main()
{int x1 = 10;int x2 = { 20 }; //初始化變量x2int array1[] { 1, 2, 3, 4, 5 }; //初始話array1數組省略賦值符號char str[] { "hello world" };Point p { 1, 2 };return 0;
}

列表初始化可以對 new 對象進行初始化:

int* pa = new int[5]{ 1, 2, 3, 4, 5 };

創建對象時使用列表初始化會調用該對象的構造函數:

class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){std::cout << "Date(int year, int month, int day)" << std::endl;}private:int _year;int _month;int _day;
};int main()
{Date d(2024, 1, 1); //調用構造函數//使用列表初始化Date d1 = { 2024, 1, 2 }; //構造+拷貝構造==>編譯優化為構造Date d2{ 2024 ,1, 3 };return 0;
}

在這里插入圖片描述

列表初始化還可以運用在容器上:

#include <vector>
#include <list>int main()
{std::vector<int> v1 = { 1, 2, 3, 4, 5 }; //初始化vector容器std::list<int> lt1 = { 10, 20, 30, 40 }; //初始化list容器return 0;
}

注意:在初始化 vector 和 list 這樣的容器的時候,并不是直接去調用 vector 和 list 的構造函數。vector 和 list 的構造函數也不支持這么多參數的傳參。

initializer_list

花括號里面的初始化內容,C++會識別成 initializer_list

int main()
{auto i1 = { 1, 2, 3, 4, 5, 6 };auto i2 = { 10, 20, 30, 40, 50, 60 };std::cout << typeid(i1).name() << std::endl;std::cout << typeid(i2).name() << std::endl;return 0;
}

在這里插入圖片描述

initializer_list 是一個類:
在這里插入圖片描述
initializer_list 會構建一個類型,這個類型有兩個指針:第一個指針指向列表的開始,另一個指針指向列表結尾的下一個位置

在這里插入圖片描述

int main()
{auto i1 = { 1, 2, 3, 4, 5, 6 };auto it1 = i1.begin();auto it2 = i1.end();std::cout << it1 << std::endl;std::cout << it2 << std::endl;std::cout << it2 - it1 << std::endl; return 0;
}

在這里插入圖片描述
尾指針地址減去列表首元素的地址,得到就是列表元素個數

提示:列表中的內容是不能修改的,因為它們是被存放到常量區

int main()
{auto i1 = { 1, 2, 3, 4, 5, 6 };auto it = i1.begin();(*it)++; //報錯return 0;
}

在這里插入圖片描述
當然,我們也可以使用這個類:

int main()
{std::initializer_list<int> il = { 1, 2, 3, 4, 5, 6 };for (auto& e : il){std::cout << e << " ";}std::cout << std::endl;return 0;
}

在這里插入圖片描述

為什么 vector 和 list 容器能夠支持列表初始化呢?

C++11 標準出來后,像 vector 和 list 這樣的容器推出了這樣的構造函數:

vector(initializer_list<value_type> il, const allocator_type& alloc = allocator_type());

vector 和 list 通過 initializer_list類去初始化列表,進而實現 vector 和 list 的構造初始化。

下面來實現一個簡單版的 vector 支持 initializer_list 的構造函數:

vector(std::initializer_list<T> il)
{reserve(il.size()); //檢查容量for (auto& e : il)push_back(e);
}

下面再來舉例幾個列表初始化的案例:

#include <map>
#include <set>
#include <vector>int main()
{std::vector<int> v1 = { 1, 2, 3, 4, 5 };std::vector<int> v2 = { 10, 20, 30, 40, 50 };std::vector<std::vector<int>> vv1 = { v1 ,v2 };//對象初始化std::vector<std::vector<int>> vv2 = { std::vector<int>{100, 200, 300}, v2 }; //匿名對象初始化std::vector<std::vector<int>> vv3 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; //編譯器自動推導類型std::set<std::vector<int>> s = { {1, 2, 3}, {10, 20, 30} };std::map<std::string, int> m = { {"蘋果", 1}, {"香蕉", 2}, {"哈密瓜", 3} };return 0;
}

🍁decltype 推導表達式類型

decltype 是 C++11 中引入的一個新的關鍵字,主要用于 聲明和推導表達式的類型

int main()
{int x = 10;int y = 20;double a = 1.1;double b = 2.2;decltype (x + y) ret1;decltype (b - a) ret2;decltype (&x) ret3;std::cout << typeid(ret1).name() << std::endl;std::cout << typeid(ret2).name() << std::endl;std::cout << typeid(ret3).name() << std::endl;return 0;
}

在這里插入圖片描述

decltype 可以用于 auto 推導不了類型的場景,例如模板的實例化傳參:

int main()
{double a = 1.1;double b = 2.2;//要求vector存儲與 a*b 表達式的返回值一致的類型std::vector<decltype(a * b)> v; //利用 decltype 推導表達式的類型return 0;
}

🍁可變參數模板

C++98/03中,類模板的和函數模板中只能含有固定數量的模板參數,比較局限。在 C++11 引入了可變參數模板,可以創建可變參數函數和類模板。

示例:

template <class ...Args>  //...Args表示模板參數包
void ShowList(Args... args)
{}int main()
{ShowList();ShowList(1);ShowList(1, 'x'); //不會限制傳入的類型和參數的個數return 0;
}
  • Args是一個模板參數包,args是一個函數形參參數包

在函數聲明一個形參參數包 Args... args ,表示這個參數包中可以被傳入的參數個數是 0 個甚至是多個參數

也可以用sizeof來統計傳入參數的個數,如下:

#include <iostream>
using namespace std;template<typename ...Args>
void ShowList(Args... args)
{cout << sizeof...(args) << endl; //統計傳入參數的個數
}int main()
{ShowList();ShowList(1);ShowList(1, 'x'); //不會限制類型ShowList(1, 'x', "abc"); return 0;
}

在這里插入圖片描述

解析可變參數包

可變參數的作用我們看到了,就是解決了傳參個數的限制。但是,當一個函數設置了參數包,那么在函數內部我們如何去獲取可變參數包參數變量呢?

方法一

C++11提供了一個遞歸的方式來解析可變參數包,在函數模板中多設置一個模板參數:

void ShowList()
{cout << endl;
}template<typename T, typename ...Args>
void ShowList(const T& val, Args... args)
{cout << val << " "; ShowList(args...);//傳入參數包,遞歸解析
}
int main()
{ShowList();ShowList(1);ShowList(1, 'x'); ShowList(1, 'x', "abc"); return 0;
}

在這里插入圖片描述

當參數被傳入后,T 模板參數 val 會獲取首次傳入的參數。在之后都是獲取到可變參數包的參數內容,每獲取一次,可變參數個數遞歸傳給下一次 ShowList 的參數個數就會減少一次。至此,就達到解析可變參數包的效果

由于在參數包中傳入的參數個數可以是 0 個,因此當參數包個數為 0 時也就是遞歸結束的條件!

方法二

通過調用函數的方式初始化數組來解析參數包:

template<typename T>
int PrintArg(const T& t)
{cout << t << " ";return 0;
}
template<typename ...Args>
void ShowList(Args... args)
{int arr[] = { PrintArg(args)... }; //初始化數組cout << endl;
}
int main()
{ShowList();ShowList(1);ShowList(1, 'x'); ShowList(1, 'x', "abc"); return 0;
}

在這里插入圖片描述

ShowList(1, 'x', "abc"); 為例子,編譯器在編譯階段會將上面代碼解析為下面這樣:

void ShowList(int a1, char a2, string a3)
{int arr[] = { PrintArg(a1), PrintArg(a2), PrintArg(a3) };cout << endl;
}

使用參數包會影響編譯器的效率,因為要推演函數參數的類型。對此,一般的參數包都會設計成下面這樣的情況:

這里拿 ShowList 模板函數為例子

template<typename ...Args>
void ShowList(Args&&... args) //這里的&&表示折疊引用
{int arr[] = { PrintArg(args)... }; //初始化數組cout << endl;
}

在參數包后加上 &&,在推演參數類型時,傳遞的參數為左值 && 就會折疊為左值;傳遞的參數為右值 && 就沒有變化還是右值;因此,在參數包后加上 &&,也被稱為萬能引用

🍁lambda 表達式

介紹 lambda 表達式前,先來看這樣的一個例子:

struct Goods
{string _name;  // 名字double _price; // 價格int _evaluate; // 評價Goods(const char* str, double price, int evaluate):_name(str), _price(price), _evaluate(evaluate){}
};int main()
{vector<Goods> v = { { "蘋果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠蘿", 1.5, 4 } };return 0;
}

vector 容器中的 Goods 對象有這樣的屬性:價格、名稱 和 重量。

現在,如果想要將 vector 容器中的 Goods對象 按照價格進行降序排序,正常操會是這樣的:先定義一個對貨物的價格做比較的仿函數,再使用 sort 函數進行排序處理

struct ComparePriceGreater //定義仿函數
{bool operator()(const Goods& g1, const Goods& g2){return g1._price > g2._price;}
};int main()
{vector<Goods> v = { { "蘋果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠蘿", 1.5, 4 } };//降序sort(v.begin(), v.end(), ComparePriceGreater());return 0;
}

為了方便展示,這里直接使用了 VS 的監視窗口。

排序前:
在這里插入圖片描述

排序后結果如下:
在這里插入圖片描述

可以看到在 vector 容器中,各個物品都是按照價格降序的順序進行排列。

在使用仿函數時,需要定義一個類,實現對應的函數運算符重載。仿函數的名字,定義都是有些許的繁瑣和麻煩。

在 C++11引出了這么一個新的語法:lambda 表達式 可以代替仿函數而去使用 sort 函數。

下面就來介紹一下 lambda 表達式。

lambda 表達式由以下幾個部分構成:

  • [] 捕捉列表:編譯器會根據 [] 來判斷代碼是否為 lambda 表達式。[] 捕捉列表 用于捕獲上下域中的變量提供給lambda 函數使用
  • ()參數列表:與普通的函數參數列表一樣,當形參不存在時,()可以省略不寫
  • mutable:通常情況下,lambda 表達式總是一個const 函數,mutable 關鍵字用于取消 lambda表達式的常性,可以省略
  • ->返回值類型:用追蹤返回類型形式聲明函數的返回值類型,返回值類型明確情況下可以省略不寫,由編譯器自動推導
  • {}函數體:實現 lambda 表達式的功能,函數體內部可以使用形參列表的內容,以及被捕獲的變量值

lambda 表達式的書寫格式:[] () mutable->return-type {}

注意:lambda 表達式返回值是一個對象

下面來舉個示例,實現兩個數相加的 lambda 表達式 :

int main()
{std::cout << [](int x, int y)->int { return x + y; }(1, 2) << std::endl;return 0;
}

在這里插入圖片描述
但是這樣寫 lambda表達式很抽象,不利于代碼的閱讀。

lambda 表達式返回值是一個對象,可以將上面代碼改寫為下面這樣:

int main()
{auto add = [](int x, int y)->int { return x + y; }; //讓編譯器自動推導lambda表達式的類型std::cout << add(10, 20) << std::endl;return 0;
}

在這里插入圖片描述

將 lambda 表達式返回,編譯器會自動推導 lambda表達式類型定義為add。實例化一個 add 匿名對象執行對應的相加功能,通過打印輸最后出到終端。

上面是通過傳參的方式實現兩個數相加的功能,下面用 lambda 表達式的捕獲方式來實現相加功能:

int main()
{int x = 10, y = 20;auto add = [x, y]()->int { return x + y; }; //用[]來捕獲x和y的值std::cout << add() << std::endl;return 0;
}

在這里插入圖片描述

對 lambda 表達式有了一定了解后,我們再回過頭來看看先前舉的例子:

struct ComparePriceGreater //定義仿函數
{bool operator()(const Goods& g1, const Goods& g2){return g1._price > g2._price;}
};int main()
{vector<Goods> v = { { "蘋果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠蘿", 1.5, 4 } };//降序sort(v.begin(), v.end(), ComparePriceGreater());return 0;
}

寫仿函數的進行排序的方式是不是太過于有點麻煩了,我們可以將仿函數改寫成 lambda 表達式:

int main()
{vector<Goods> v = { { "蘋果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠蘿", 1.5, 4 } };sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) //使用lambda表達式{return g1._price > g2._price;});return 0;
}

排序前:
在這里插入圖片描述

排序后:
在這里插入圖片描述
使用lambda表達式進行排序的實現效果跟使用仿函數一樣

捕捉列表的使用

下面用 lambda 表達式實現 swap 函數:

可以通過參數列表來實現,不過在使用參數列表時,需要用引用參數來接收:

int main()
{int x = 10, y = 20;//引用傳入變量,正常值拷貝不會影響lambda表達式外的變量auto swap = [](int& x, int& y) {int tmp = x;x = y;y = tmp;};swap(x, y); //實例化swap匿名對象cout << x << " " << y << endl;	return 0;
}

在這里插入圖片描述

lambda 表達式內部作用域 與 當前使用 lambda表達式 的函數作用域是分開的

也就是說:在當前函數中的變量,在 lambda 表達式內部是使用不了的。如果,想要在 lambda 表達式中使用當前函數的變量,有兩種方式:參數列表傳參捕捉列表

如上舉例,可以想象成函數傳參。

下面再來通過捕獲列表來實現 swap交換功能:

int main()
{int x = 10, y = 20;auto swap = [x, y]() //捕獲x,y變量{int tmp = x;x = y;y = tmp;};swap();cout << x << " " << y << endl;return 0;
}

但是,直接捕獲的變量,對其直接進行修改會報錯:
在這里插入圖片描述
在 lambda表達式中 被捕獲的變量是按照拷貝的形式

這里的 x 和 y 變量被捕獲到 lambda表達式后,是被 const 修飾過的,直接進行值修改會報錯

捕捉列表有兩種捕獲變量的方式:傳值捕捉傳引用捕捉

傳值捕捉傳引用捕捉 可以在捕捉列表中任意組合,下面來舉例幾個案例:

int x = 10, y = 20;
[&]() {};//全部傳引用捕捉
[=]() {};//全部傳值捕捉//混合捕捉
[&x, y]() {};
[&, x]() {};
[=, &y]() {};

捕捉列表不能重復捕捉同一個變量,下面這種情況編譯器會報錯:

int x = 10;
[=, x]() {}; //出錯

回到剛剛實現的 lambda 表達式。如果想要通過 傳值捕捉 實現 swap 交換的功能,就要在 lambda 表達式中就要加上 mutable關鍵字:

int main()
{int x = 10, y = 20;auto swap = [x, y]() mutable //捕獲x,y變量,使用mutable關鍵字{int tmp = x;x = y;y = tmp;};swap();cout << x << " " << y << endl;return 0;
}

在這里插入圖片描述
當然,也可以通過 傳引用捕捉 的方式實現對應的功能:

int main()
{int x = 10, y = 20;auto swap = [&x, &y]() //傳引用捕捉{int tmp = x;x = y;y = tmp;};swap();cout << x << " " << y << endl;return 0;
}

在這里插入圖片描述

運用場景舉例

實現這樣的一個程序,在這個程序中創建線程池,使得每個線程都能夠執行打印特定數字的功能:

#include <thread>
#include <vector>using namespace std;int main()
{int n = 0;//創建n個線程cin >> n;vector<thread> thds(n); //創建n個默認構造線程for (int i = 0; i < n; i++){size_t m = 0;cin >> m; //輸入打印數的范圍//創建線程池,使每個線程執行打印功能thds[i] = thread([i, m]() //移動賦值,創建的匿名線程是將亡值{for (int j = 0; j < m; j++){//打印對應線程編號與數字cout << this_thread::get_id() << ":" << j << endl;}cout << endl;});}//等待線程池for (auto& th : thds) th.join(); //這里必須傳引用,線程沒有拷貝構造(沒有意義)return 0;
}

lambda表達式 與 函數對象

先來介紹一下函數對象:函數對象,又被稱為仿函數。實現一個類,在這個類中實現一個 operator() 運算符重載。實例化出這個類對象,在調用 operator() 時,就像調用函數那般。就被稱為仿函數。

下面實現一個仿函數 和 lambda 表達式,實現的功能都類似:

class Rate
{
public:Rate(double rate) : _rate(rate){}double operator()(double money, int year){return _rate * money * year;}
private:double _rate;
};int main()
{//函數對象double rate = 0.49;Rate r1(rate);//構造r1(1000, 2);//lambda表達式auto r2 = [=](double money, int year)->double{return money * year * rate;};r2(1000, 2);return 0;
}

在VS2022調試下,查看反匯編:
在這里插入圖片描述
在這里插入圖片描述

下面再來計算一下仿函數的大小和 lambda表達式的大小,還是拿上面的例子:

class Rate
{
public:Rate(double rate) : _rate(rate){}double operator()(double money, int year){return _rate * money * year;}
private:double _rate;
};int main()
{double rate = 0.49;auto r2 = [=](double money, int year)->double{return money * year * rate;};cout << sizeof Rate << endl; //查看Rate類的大小cout << sizeof r2 << endl; //查看r2的lambda表達式的大小return 0;
}

在這里插入圖片描述

反觀底層,仿函數和lambda表達式都是類似的匯編調用方式。而且,如果 lambda表達式捕獲的變量 與 仿函數類中的成員一樣,那么計算的大小都是一樣的。

可以這樣說:在編譯器眼里,lambda表達式就是仿函數。只不過在用戶表面看來,兩個表達式方式是那么的不一樣。

lambda 表達式就介紹到這里。

C++11新增的語法當然還不止這些,如果對 C++11 還感興趣的老鐵,可以看看小編的另一篇文章:C++入門語法介紹

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10924.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10924.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10924.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32F407-驅動SHT41采集溫濕度

STM32F407-驅動SHT41采集溫濕度 SHT41 SHT41通過I2C方式進行驅動 從機地址&#xff1a; 0x44 獲取數據方式 1&#xff09;先發送I2C寫&#xff0c;寫入特定指令 2&#xff09;延時一段時間&#xff0c;等待SHT41處理 3&#xff09;再進行I2C讀&#xff0c;讀數據即可 一些…

Ansible(二)

一、Playbook基礎 1.1 Playbook定義 Playbook其實是Ansible服務的一個配置文件&#xff0c;Ansible使用Playbook的YAML語言配置編寫成操作需求&#xff0c;實現對遠端主機或策略部署&#xff0c;實現對遠端主機的控制與管理。 1.2 Playbook組成 Tasks&#xff1a;任務&…

【Qt 學習筆記】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主頁&#xff1a;Duck Bro 博客主頁系列專欄&#xff1a;Qt 專欄關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章編號&#x…

skynet - spinlock 簡單的自旋鎖

spinlock.h 代碼位于&#xff1a; https://github.com/cloudwu/skynet/blob/master/skynet-src/spinlock.h 該文件內&#xff0c;根據不同環境提供了 3 種 api 實現&#xff1a; pthread_mutex_t 系列函數gcc 內置原子操作函數std atomic 系列函數 看了下&#xff0c;效率最…

滲透測試-信息收集

網絡安全信息收集是網絡安全領域中至關重要的一環&#xff0c;它涉及到對目標系統、網絡或應用進行全面而細致的信息搜集和分析。這一過程不僅有助于理解目標網絡的結構、配置和潛在的安全風險&#xff0c;還能為后續的滲透測試、風險評估和安全加固提供有力的支持。 在網絡安…

安卓開發--新建工程,新建虛擬手機,按鍵事件響應(含:Android中使用switch-case遇到case R.id.xxx報錯)

安卓開發--新建工程&#xff0c;新建虛擬手機&#xff0c;按鍵事件響應 1.前言2.運行一個工程2.1布局一個Button2.2 button一般點擊事件2.2 button屬性點擊事件2.2 button推薦點擊事件&#xff08;含&#xff1a;Android中使用switch-case遇到case R.id.xxx報錯&#xff09; 本…

MATLAB 多項式

MATLAB 多項式 MATLAB將多項式表示為行向量&#xff0c;其中包含按冪次降序排列的系數。例如&#xff0c;方程P(x) X 4 7 3 - 5 9可以表示為 p [1 7 0 -5 9]; 求值多項式 polyval函數用于求一個特定值的多項式。例如&#xff0c;在 x 4 時&#xff0c;計算我們之前的多項式…

HTTP URL 詳解

概述 URL 提供了一種定位因特網上任意資源的手段&#xff0c;大多數 URL 語法都由以下九個結構的通用格式組成&#xff1a; <scheme>://<user>:<password><host>:<port>/<path>;<params>?<query>#<frag> 方案&#…

命令重裝Linux系統,無需登錄控制面板

命令重裝Linux系統&#xff0c;無需登錄控制面板 部分無法登錄控制面板使用這個腳本 自動安裝安裝腳本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安裝命令參考 # 自動安裝 Debian 10 buster …

基于YOLOV8復雜場景下船舶目標檢測系統

1. 背景 海洋作為地球上70%的表面積&#xff0c;承載著人類生活、經濟發展和生態系統的重要功能。船舶作為海洋活動的主要載體之一&#xff0c;在海上運輸、資源開發、環境監測等方面發揮著重要作用。復雜海洋環境下的船舶目標檢測成為了海事管理、海洋資源開發和環境保護等領…

人工智能軌道交通行業周刊-第79期(2024.4.22-5.12)

本期關鍵詞&#xff1a;無人機巡檢、車機聯控、減速頂、Agent、GraphRAG、RAGFlow 1 整理涉及公眾號名單 1.1 行業類 RT軌道交通人民鐵道世界軌道交通資訊網鐵路信號技術交流北京鐵路軌道交通網鐵路視點ITS World軌道交通聯盟VSTR鐵路與城市軌道交通RailMetro軌道世界鐵路那…

2024OD機試卷-API集群負載統計 (java\python\c++)

題目:API集群負載統計 題目描述 某個產品的RESTful API集合部署在 服務器 集群的多個節點上,近期對客戶端訪問日志進行了采集,需要統計各個API的訪問頻次,根據熱點信息在服務器節點之間做負載 均衡,現在需要實現熱點信息統計查詢功能。 RESTful API是由多個層級構成,層…

《動手學深度學習》V2(11-18)

文章目錄 十一、二 模型選擇與過擬合和欠擬合1、模型的選擇2、過擬合和欠擬合3、估計模型容量4、線性分類器的VC維5、過擬合欠擬合的代碼實現 :fire:①生成數據集②定義評估損失③定義訓練函數④三階多項式函數擬合⑤線性函數擬合(欠擬合)⑤高階多項式函數擬合(過擬合) 十三、權…

【C語言】精品練習題

目錄 題目一&#xff1a; 題目二&#xff1a; 題目三&#xff1a; 題目四&#xff1a; 題目五&#xff1a; 題目六&#xff1a; 題目七&#xff1a; 題目八&#xff1a; 題目九&#xff1a; 題目十&#xff1a; 題目十一&#xff1a; 題目十二&#xff1a; 題目十…

「 網絡安全常用術語解讀 」漏洞利用預測評分系統EPSS詳解

1. 概覽 EPSS&#xff08;Exploit Prediction Scoring System&#xff0c;漏洞利用預測評分系統&#xff09; 提供了一種全新的高效、數據驅動的漏洞管理功能。EPSS是一項數據驅動的工作&#xff0c;使用來自 CVE 的當前威脅信息和現實世界的漏洞數據。 EPSS 模型產生 0 到 1&…

vue 中的 Vuex

Vuex Vuex是什么&#xff1f; 概念&#xff1a;專門在vue中實現集中式狀態&#xff08;數據&#xff09;管理的一個Vue插件&#xff0c;對Vue應用中多個組件的共享狀態進行集中式的管理(讀/寫&#xff09;&#xff0c;也是一種組件間通信的方式&#xff0c;且適用于任意組件間…

2024最新小紅書電商落地實操課,從入門到精通,打造爆款方法(16節課)

你是不是經常在小紅書上看到各種各樣的推廣和引流方法&#xff0c;卻感覺實際操作起來很困難&#xff1f; 那么&#xff0c;這門2024最新小紅書電商落地實操課就是為你量身定制的&#xff01;從入門到精通&#xff0c;不僅能讓你了解電商平臺的基本規則和玩法&#xff0c;還能…

ansible------inventory 主機清單

目錄 inventory 中的變量 2&#xff09;組變量[webservers:vars] #表示為 webservers 組內所有主機定義變量&#xff0c;所有組內成 員都有效 ansible_userrootansible_passwordabc1234 3&#xff09; [all:vars…

VulkanSDK Demos vkcube 編譯失敗

操作系統: Windows 11 23H2 Vulkan 版本: 1.3.2.280.0 Visual Studio 版本: 2022 在VulkanSDK/Demos目錄下存在一個demo solution,其中包含兩個project, vkcube和vkcubepp,兩個分別為C語言和C寫的示例程序, 但是直接編譯這兩個project時會編譯失敗,報了以下錯誤: fatal err…

[Java EE] 文件IO(一):文件概念與文件系統操作

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄:&#x1f355; Collection與數據結構 (91平均質量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …