日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

C++模板基礎(chǔ)及代碼實(shí)戰(zhàn)

來源: 責(zé)編: 時(shí)間:2023-12-06 17:12:40 288觀看
導(dǎo)讀一、C++ 模板概覽1.泛型編程的支持C++ 不僅為面向?qū)ο缶幊烫峁┝苏Z言支持,還支持泛型編程。正如第6章《設(shè)計(jì)可重用性》中討論的,泛型編程的目標(biāo)是編寫可重用的代碼。C++ 中支持泛型編程的基本工具是模板。雖然模板不嚴(yán)

一、C++ 模板概覽

1.泛型編程的支持

C++ 不僅為面向?qū)ο缶幊烫峁┝苏Z言支持,還支持泛型編程。正如第6章《設(shè)計(jì)可重用性》中討論的,泛型編程的目標(biāo)是編寫可重用的代碼。C++ 中支持泛型編程的基本工具是模板。雖然模板不嚴(yán)格是面向?qū)ο蟮奶匦裕鼈兛梢耘c面向?qū)ο缶幊探Y(jié)合產(chǎn)生強(qiáng)大的效果。FRP28資訊網(wǎng)——每日最新資訊28at.com

FRP28資訊網(wǎng)——每日最新資訊28at.com

2.模板的核心

在過程化編程范式中,主要編程單元是過程或函數(shù)。函數(shù)之所以有用,主要是因?yàn)樗鼈冊(cè)试S你編寫與特定值無關(guān)的算法,因此可以用于許多不同的值。例如,C++ 中的 sqrt() 函數(shù)計(jì)算調(diào)用者提供的值的平方根。只計(jì)算一個(gè)數(shù)字(如四)的平方根的函數(shù)不會(huì)特別有用!sqrt() 函數(shù)是針對(duì)一個(gè)參數(shù)編寫的,該參數(shù)是調(diào)用者傳遞的任何值的代表。FRP28資訊網(wǎng)——每日最新資訊28at.com

對(duì)象導(dǎo)向編程范式增加了對(duì)象的概念,對(duì)象將相關(guān)數(shù)據(jù)和行為組合在一起,但它并沒有改變函數(shù)和方法參數(shù)化值的方式。FRP28資訊網(wǎng)——每日最新資訊28at.com

3.模板的進(jìn)階參數(shù)化

模板將參數(shù)化概念進(jìn)一步擴(kuò)展,允許你對(duì)類型以及值進(jìn)行參數(shù)化。C++ 中的類型包括 int、double 等基本類型,以及 SpreadsheetCell、CherryTree 等用戶定義的類。有了模板,你可以編寫不僅與它將要給定的值無關(guān),而且與這些值的類型無關(guān)的代碼。例如,你可以編寫一個(gè)堆棧類定義,而不是編寫用于存儲(chǔ) int、Cars 和 SpreadsheetCells 的單獨(dú)堆棧類,這個(gè)堆棧類定義可以用于任何這些類型。FRP28資訊網(wǎng)——每日最新資訊28at.com

4.模板的使用和重要性

盡管模板是一項(xiàng)驚人的語言特性,但 C++ 中的模板在語法上可能令人困惑,許多程序員避免自己編寫模板。然而,每個(gè)程序員至少需要知道如何使用模板,因?yàn)樗鼈儽粡V泛用于庫,例如 C++ 標(biāo)準(zhǔn)庫。本章教你如何在 C++ 中支持模板,重點(diǎn)是在標(biāo)準(zhǔn)庫中出現(xiàn)的方面。在此過程中,你將了解一些除了使用標(biāo)準(zhǔn)庫之外,你可以在程序中運(yùn)用的巧妙特性。FRP28資訊網(wǎng)——每日最新資訊28at.com

二、類模板

1.類模板的定義和應(yīng)用

類模板定義了一個(gè)類,其中一些變量的類型、方法的返回類型和/或方法的參數(shù)被指定為模板參數(shù)。類模板主要用于容器,即存儲(chǔ)對(duì)象的數(shù)據(jù)結(jié)構(gòu)。這一節(jié)通過運(yùn)行示例 Grid 容器來說明。為了保持示例的合理長(zhǎng)度并足夠簡(jiǎn)單以闡明特定要點(diǎn),本章的不同部分將為 Grid 容器添加不在后續(xù)部分使用的功能。FRP28資訊網(wǎng)——每日最新資訊28at.com

2.編寫類模板

假設(shè)你想要一個(gè)通用的游戲棋盤類,可以用作國際象棋棋盤、跳棋棋盤、井字棋棋盤或任何其他二維游戲棋盤。為了使其具有通用性,你應(yīng)該能夠存儲(chǔ)國際象棋棋子、跳棋棋子、井字棋棋子或任何類型的游戲棋子。FRP28資訊網(wǎng)——每日最新資訊28at.com

三、不使用模板編寫代碼

1.通過多態(tài)性建立通用游戲棋盤

在沒有模板的情況下,構(gòu)建通用游戲棋盤的最佳方法是使用多態(tài)性來存儲(chǔ)通用的 GamePiece 對(duì)象。然后,你可以讓每個(gè)游戲的棋子從 GamePiece 類繼承。例如,在國際象棋游戲中,ChessPiece 將是 GamePiece 的派生類。通過多態(tài)性,編寫為存儲(chǔ) GamePiece 的 GameBoard 也可以存儲(chǔ) ChessPiece。因?yàn)榭赡苄枰獜?fù)制 GameBoard,所以 GameBoard 需要能夠復(fù)制 GamePiece。這種實(shí)現(xiàn)使用多態(tài)性,所以一種解決方案是在 GamePiece 基類中添加一個(gè)純虛擬的 clone() 方法,派生類必須實(shí)現(xiàn)它以返回具體 GamePiece 的副本。FRP28資訊網(wǎng)——每日最新資訊28at.com

這是基本的 GamePiece 接口:FRP28資訊網(wǎng)——每日最新資訊28at.com

export class GamePiece {public:    virtual ~GamePiece() = default;    virtual std::unique_ptr<GamePiece> clone() const = 0;};

GamePiece 是一個(gè)抽象基類。具體類,如 ChessPiece,從它派生并實(shí)現(xiàn) clone() 方法:FRP28資訊網(wǎng)——每日最新資訊28at.com

class ChessPiece : public GamePiece {public:    std::unique_ptr<GamePiece> clone() const override {        // 調(diào)用復(fù)制構(gòu)造函數(shù)來復(fù)制這個(gè)實(shí)例        return std::make_unique<ChessPiece>(*this);    }};

2.GameBoard 的實(shí)現(xiàn)

GameBoard 的實(shí)現(xiàn)使用向量的向量和 unique_ptr 來存儲(chǔ) GamePieces:FRP28資訊網(wǎng)——每日最新資訊28at.com

GameBoard::GameBoard(size_t width, size_t height) : m_width { width }, m_height { height } {    m_cells.resize(m_width);    for (auto& column : m_cells) {        column.resize(m_height);    }}GameBoard::GameBoard(const GameBoard& src) : GameBoard { src.m_width, src.m_height } {    // The ctor-initializer of this constructor delegates first to the    // non-copy constructor to allocate the proper amount of memory.    // The next step is to copy the data.    for (size_t i { 0 }; i < m_width; i++) {        for (size_t j { 0 }; j < m_height; j++) {            if (src.m_cells[i][j]) {                m_cells[i][j] = src.m_cells[i][j]->clone();            }        }    }}void GameBoard::verifyCoordinate(size_t x, size_t y) const {    if (x >= m_width) {        throw out_of_range { format("{} must be less than {}.", x, m_width) };    }    if (y >= m_height) {        throw out_of_range { format("{} must be less than {}.", y, m_height) };    }}void GameBoard::swap(GameBoard& other) noexcept {    std::swap(m_width, other.m_width);    std::swap(m_height, other.m_height);    std::swap(m_cells, other.m_cells);}void swap(GameBoard& first, GameBoard& second) noexcept {    first.swap(second);}GameBoard& GameBoard::operator=(const GameBoard& rhs) {    // Copy-and-swap idiom    GameBoard temp { rhs }; // Do all the work in a temporary instance.    swap(temp); // Commit the work with only non-throwing operations.    return *this;}const unique_ptr<GamePiece>& GameBoard::at(size_t x, size_t y) const {    verifyCoordinate(x, y);    return m_cells[x][y];}unique_ptr<GamePiece>& GameBoard::at(size_t x, size_t y) {    return const_cast<unique_ptr<GamePiece>&>(as_const(*this).at(x, y));}

在這個(gè)實(shí)現(xiàn)中,at() 返回指定位置的棋子的引用,而不是棋子的副本。GameBoard 作為二維數(shù)組的抽象,應(yīng)該通過給出索引處的實(shí)際對(duì)象而不是對(duì)象的副本來提供數(shù)組訪問語義。FRP28資訊網(wǎng)——每日最新資訊28at.com

3.注意事項(xiàng)

這個(gè)實(shí)現(xiàn)為 at() 提供了兩個(gè)版本,一個(gè)返回非常量引用,另一個(gè)返回常量引用。FRP28資訊網(wǎng)——每日最新資訊28at.com

使用復(fù)制和交換習(xí)語(copy-and-swap idiom)用于賦值運(yùn)算符,以及 Scott Meyer 的 const_cast() 模式來避免代碼重復(fù)。FRP28資訊網(wǎng)——每日最新資訊28at.com

4.GameBoard 類的使用

GameBoard chessBoard { 8, 8 };auto pawn { std::make_unique<ChessPiece>() };chessBoard.at(0, 0) = std::move(pawn);chessBoard.at(0, 1) = std::make_unique<ChessPiece>();chessBoard.at(0, 1) = nullptr;

這個(gè) GameBoard 類運(yùn)行得相當(dāng)好,它可以用于國際象棋棋盤的創(chuàng)建和棋子的放置。FRP28資訊網(wǎng)——每日最新資訊28at.com

四、類模板實(shí)現(xiàn)的 Grid 類

1.GameBoard 的局限性

在上一節(jié)中的 GameBoard 類雖然實(shí)用,但有其局限性。首先,你無法使用 GameBoard 來按值存儲(chǔ)元素;它總是存儲(chǔ)指針。更嚴(yán)重的問題與類型安全有關(guān)。GameBoard 中的每個(gè)單元格都存儲(chǔ)一個(gè) unique_ptr<GamePiece>。即使你存儲(chǔ)的是 ChessPieces,當(dāng)你使用 at() 請(qǐng)求特定單元格時(shí),你將得到一個(gè) unique_ptr<GamePiece>。這意味著你必須將檢索到的 GamePiece 向下轉(zhuǎn)型為 ChessPiece 才能使用 ChessPiece 的特定功能。GameBoard 的另一個(gè)缺點(diǎn)是它不能用于存儲(chǔ)原始類型,如 int 或 double,因?yàn)閱卧裰写鎯?chǔ)的類型必須派生自 GamePiece。FRP28資訊網(wǎng)——每日最新資訊28at.com

2.實(shí)現(xiàn)通用 Grid 類

因此,如果你能編寫一個(gè)通用的 Grid 類來存儲(chǔ) ChessPieces、SpreadsheetCells、ints、doubles 等就很好了。在 C++ 中,你可以通過編寫類模板來實(shí)現(xiàn)這一點(diǎn),這允許你編寫一個(gè)不指定一個(gè)或多個(gè)類型的類。然后客戶端通過指定他們想要使用的類型來實(shí)例化模板。這就是所謂的泛型編程。FRP28資訊網(wǎng)——每日最新資訊28at.com

3.泛型編程的優(yōu)勢(shì)

泛型編程的最大優(yōu)勢(shì)是類型安全。類及其方法中使用的類型是具體類型,而不是像上一節(jié)中多態(tài)解決方案那樣的抽象基類類型。例如,假設(shè)不僅有 ChessPiece,還有 TicTacToePiece:FRP28資訊網(wǎng)——每日最新資訊28at.com

class TicTacToePiece : public GamePiece {public:    std::unique_ptr<GamePiece> clone() const override {        // 調(diào)用復(fù)制構(gòu)造函數(shù)來復(fù)制這個(gè)實(shí)例        return std::make_unique<TicTacToePiece>(*this);    }};

使用上一節(jié)中的多態(tài)解決方案,沒有什么能阻止你在同一個(gè)棋盤上存儲(chǔ)井字棋棋子和國際象棋棋子:FRP28資訊網(wǎng)——每日最新資訊28at.com

GameBoard chessBoard { 8, 8 };chessBoard.at(0, 0) = std::make_unique<ChessPiece>();chessBoard.at(0, 1) = std::make_unique<TicTacToePiece>();

這樣做的一個(gè)大問題是,你需要記住一個(gè)單元格存儲(chǔ)了什么,以便在調(diào)用 at() 時(shí)執(zhí)行正確的向下轉(zhuǎn)型。FRP28資訊網(wǎng)——每日最新資訊28at.com

五、Grid 類模板的定義

1.類模板的語法

為了理解類模板,檢查其語法非常有幫助。以下示例展示了如何將 GameBoard 類修改為模板化的 Grid 類。代碼后面會(huì)詳細(xì)解釋語法。請(qǐng)注意,類名已從 GameBoard 改為 Grid。FRP28資訊網(wǎng)——每日最新資訊28at.com

2.使用值語義實(shí)現(xiàn) Grid 類

與 GameBoard 實(shí)現(xiàn)中使用的多態(tài)指針語義相比,我選擇使用值語義而不是多態(tài)來實(shí)現(xiàn)這個(gè)解決方案。m_cells 容器存儲(chǔ)實(shí)際對(duì)象,而不是指針。與指針語義相比,使用值語義的一個(gè)缺點(diǎn)是不能有真正的空單元格;也就是說,單元格必須始終包含某個(gè)值。使用指針語義時(shí),空單元格存儲(chǔ) nullptr。 std::optional 在這里提供了幫助。它允許你在仍然有表示空單元格的方法的同時(shí)使用值語義。FRP28資訊網(wǎng)——每日最新資訊28at.com

template <typename T>class Grid {public:    explicit Grid(size_t width = DefaultWidth, size_t height = DefaultHeight);    virtual ~Grid() = default;    // Explicitly default a copy constructor and assignment operator.    Grid(const Grid& src) = default;    Grid& operator=(const Grid& rhs) = default;    // Explicitly default a move constructor and assignment operator.    Grid(Grid&& src) = default;    Grid& operator=(Grid&& rhs) = default;    std::optional<T>& at(size_t x, size_t y);    const std::optional<T>& at(size_t x, size_t y) const;    size_t getHeight() const { return m_height; }    size_t getWidth() const { return m_width; }    static const size_t DefaultWidth { 10 };    static const size_t DefaultHeight { 10 };private:    void verifyCoordinate(size_t x, size_t y) const;    std::vector<std::vector<std::optional<T>>> m_cells;    size_t m_width { 0 }, m_height { 0 };};

3.類模板的詳細(xì)解讀

export template <typename T>:這一行表示接下來的類定義是一個(gè)關(guān)于類型 T 的模板,并且它正在從模塊中導(dǎo)出。template 和 typename 是 C++ 中的關(guān)鍵字。如前所述,模板在類型上“參數(shù)化”,就像函數(shù)在值上“參數(shù)化”一樣。FRP28資訊網(wǎng)——每日最新資訊28at.com

使用模板類型參數(shù)名(如 T)來表示調(diào)用者將作為模板類型參數(shù)傳遞的類型。T 的名稱沒有特殊含義——你可以使用任何你想要的名稱。FRP28資訊網(wǎng)——每日最新資訊28at.com

4.關(guān)于模板類型參數(shù)的注意事項(xiàng)

出于歷史原因,你可以使用關(guān)鍵字 class 而不是 typename 來指定模板類型參數(shù)。因此,許多書籍和現(xiàn)有程序使用類似 template <class T> 的語法。然而,在這種情況下使用 class 這個(gè)詞是令人困惑的,因?yàn)樗凳绢愋捅仨毷且粋€(gè)類,這實(shí)際上并不正確。類型可以是類、結(jié)構(gòu)體、聯(lián)合、語言的原始類型,如 int 或 double 等。FRP28資訊網(wǎng)——每日最新資訊28at.com

六、Grid 類模板與 GameBoard 類的對(duì)比

1.數(shù)據(jù)成員的變化

在之前的 GameBoard 類中,m_cells 數(shù)據(jù)成員是指針的向量的向量,這需要特殊的復(fù)制代碼,因此需要拷貝構(gòu)造函數(shù)和拷貝賦值操作符。在 Grid 類中,m_cells 是可選值的向量的向量,所以編譯器生成的拷貝構(gòu)造函數(shù)和賦值操作符是可以的。FRP28資訊網(wǎng)——每日最新資訊28at.com

2.顯式默認(rèn)構(gòu)造函數(shù)和操作符

一旦你有了用戶聲明的析構(gòu)函數(shù),就不推薦編譯器隱式生成拷貝構(gòu)造函數(shù)或拷貝賦值操作符,因此 Grid 類模板顯式地將它們默認(rèn)化。它還顯式默認(rèn)化了移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值操作符。以下是顯式默認(rèn)的拷貝賦值操作符:FRP28資訊網(wǎng)——每日最新資訊28at.com

Grid& operator=(const Grid& rhs) = default;

可以看到,rhs 參數(shù)的類型不再是 const GameBoard&,而是 const Grid&。在類定義內(nèi),編譯器會(huì)在需要時(shí)將 Grid 解釋為 Grid<T>,但如果你愿意,也可以顯式地使用 Grid<T>:FRP28資訊網(wǎng)——每日最新資訊28at.com

Grid<T>& operator=(const Grid<T>& rhs) = default;

然而,在類定義外,你必須使用 Grid<T>。當(dāng)你編寫類模板時(shí),你過去認(rèn)為的類名(Grid)實(shí)際上是模板名。當(dāng)你想談?wù)搶?shí)際的 Grid 類或類型時(shí),你必須使用模板 ID,即 Grid<T>,這些是針對(duì)特定類型(如 int、SpreadsheetCell 或 ChessPiece)的 Grid 類模板的實(shí)例化。FRP28資訊網(wǎng)——每日最新資訊28at.com

3.at() 方法的更新

由于 m_cells 不再存儲(chǔ)指針,而是存儲(chǔ)可選值,at() 方法現(xiàn)在返回 std::optional<T> 而不是 unique_ptrs,即可以有類型 T 的值,也可以為空的 optionals:FRP28資訊網(wǎng)——每日最新資訊28at.com

std::optional<T>& at(size_t x, size_t y);const std::optional<T>& at(size_t x, size_t y) const;

七、Grid 類模板的方法定義

1.模板方法定義格式

每個(gè) Grid 模板的方法定義都必須以 template <typename T> 說明符開頭。構(gòu)造函數(shù)如下所示:FRP28資訊網(wǎng)——每日最新資訊28at.com

template <typename T>Grid<T>::Grid(size_t width, size_t height) : m_width { width }, m_height { height } {    m_cells.resize(m_width);    for (auto& column : m_cells) {        column.resize(m_height);    }}

注意:類模板的方法定義需要對(duì)使用該類模板的任何客戶端代碼可見。這對(duì)方法定義的位置施加了一些限制。通常,它們直接放在類模板定義本身的同一文件中。本章后面討論了繞過這一限制的一些方法。FRP28資訊網(wǎng)——每日最新資訊28at.com

2.類名和方法定義

請(qǐng)注意,:: 前的類名是 Grid<T>,而不是 Grid。在所有方法和靜態(tài)數(shù)據(jù)成員定義中,你必須指定 Grid<T> 作為類名。構(gòu)造函數(shù)的主體與 GameBoard 構(gòu)造函數(shù)相同。其他方法定義也類似于 GameBoard 類中的對(duì)應(yīng)方法,但有適當(dāng)?shù)哪0搴?nbsp;Grid<T> 語法變化:FRP28資訊網(wǎng)——每日最新資訊28at.com

template <typename T>void Grid<T>::verifyCoordinate(size_t x, size_t y) const {    if (x >= m_width) {        throw std::out_of_range { std::format("{} must be less than {}.", x, m_width) };    }    if (y >= m_height) {        throw std::out_of_range { std::format("{} must be less than {}.", y, m_height) };    }}template <typename T>const std::optional<T>& Grid<T>::at(size_t x, size_t y) const {    verifyCoordinate(x, y);    return m_cells[x][y];}template <typename T>std::optional<T>& Grid<T>::at(size_t x, size_t y) {    return const_cast<std::optional<T>&>(std::as_const(*this).at(x, y));}

3.類模板方法的默認(rèn)值

注意:如果類模板方法的實(shí)現(xiàn)需要某個(gè)模板類型參數(shù)的默認(rèn)值(例如 T),則可以使用 T{} 語法。T{} 調(diào)用對(duì)象的默認(rèn)構(gòu)造函數(shù)(如果 T 是類類型),或生成零(如果 T 是基本類型)。這種語法稱為零初始化語法。它是為尚不知道類型的變量提供合理默認(rèn)值的好方法。FRP28資訊網(wǎng)——每日最新資訊28at.com

八、使用 Grid 類模板

1.模板實(shí)例化

當(dāng)你想要?jiǎng)?chuàng)建 Grid 對(duì)象時(shí),不能單獨(dú)使用 Grid 作為類型;你必須指定將存儲(chǔ)在該 Grid 中的類型。為特定類型創(chuàng)建類模板對(duì)象稱為實(shí)例化模板。以下是一個(gè)示例:FRP28資訊網(wǎng)——每日最新資訊28at.com

Grid<int> myIntGrid; // 聲明一個(gè)存儲(chǔ) int 的網(wǎng)格,使用構(gòu)造函數(shù)的默認(rèn)參數(shù)。Grid<double> myDoubleGrid { 11, 11 }; // 聲明一個(gè) 11x11 的 double 類型網(wǎng)格。myIntGrid.at(0, 0) = 10;int x { myIntGrid.at(0, 0).value_or(0) };Grid<int> grid2 { myIntGrid }; // 拷貝構(gòu)造函數(shù)Grid<int> anotherIntGrid;anotherIntGrid = grid2; // 賦值操作符

請(qǐng)注意 myIntGrid、grid2 和 anotherIntGrid 的類型是 Grid<int>。你不能在這些網(wǎng)格中存儲(chǔ) SpreadsheetCells 或 ChessPieces;如果嘗試這樣做,編譯器將生成錯(cuò)誤。FRP28資訊網(wǎng)——每日最新資訊28at.com

2.使用 value_or()

還要注意 value_or() 的使用。at() 方法返回一個(gè)可選引用,可能包含值也可能不包含。value_or() 方法在可選項(xiàng)中有值時(shí)返回該值;否則,它返回給 value_or() 的參數(shù)。FRP28資訊網(wǎng)——每日最新資訊28at.com

3.模板類型的重要性

模板類型的指定非常重要;以下兩行都無法編譯:FRP28資訊網(wǎng)——每日最新資訊28at.com

Grid test; // 無法編譯Grid<> test; // 無法編譯

如果你想聲明一個(gè)接受 Grid 對(duì)象的函數(shù)或方法,你必須在 Grid 類型中指定存儲(chǔ)在網(wǎng)格中的類型:FRP28資訊網(wǎng)——每日最新資訊28at.com

void processIntGrid(Grid<int>& grid) { /* 省略正文以簡(jiǎn)潔 */ }

或者,你可以使用本章后面討論的函數(shù)模板,編寫一個(gè)模板化的函數(shù),該函數(shù)根據(jù)網(wǎng)格中元素的類型進(jìn)行模板化。FRP28資訊網(wǎng)——每日最新資訊28at.com

注意:你可以使用類型別名來簡(jiǎn)化完整的 Grid 類型的重復(fù)書寫,例如 Grid<int>:FRP28資訊網(wǎng)——每日最新資訊28at.com

using IntGrid = Grid<int>;void processIntGrid(IntGrid& grid) { /* 正文 */ }FRP28資訊網(wǎng)——每日最新資訊28at.com

4.Grid 類模板的多樣性

Grid 類模板可以存儲(chǔ)的不僅僅是 int。例如,你可以實(shí)例化一個(gè)存儲(chǔ) SpreadsheetCells 的 Grid:FRP28資訊網(wǎng)——每日最新資訊28at.com

Grid<SpreadsheetCell> mySpreadsheet;SpreadsheetCell myCell { 1.234 };mySpreadsheet.at(3, 4) = myCell;

你也可以存儲(chǔ)指針類型:FRP28資訊網(wǎng)——每日最新資訊28at.com

Grid<const char*> myStringGrid;myStringGrid.at(2, 2) = "hello";

指定的類型甚至可以是另一個(gè)模板類型:FRP28資訊網(wǎng)——每日最新資訊28at.com

Grid<vector<int>> gridOfVectors;vector<int> myVector { 1, 2, 3, 4 };gridOfVectors.at(5, 6) = myVector;

你還可以在自由存儲(chǔ)區(qū)動(dòng)態(tài)分配 Grid 模板實(shí)例:FRP28資訊網(wǎng)——每日最新資訊28at.com

auto myGridOnFreeStore { make_unique<Grid<int>>(2, 2) }; // 自由存儲(chǔ)區(qū)上的 2x2 網(wǎng)格。myGridOnFreeStore->at(0, 0) = 10;int x { myGridOnFreeStore->at(0, 0).value_or(0) };

本文鏈接:http://www.www897cc.com/showinfo-26-38739-0.htmlC++模板基礎(chǔ)及代碼實(shí)戰(zhàn)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 如何在組織中有效地使用低代碼工具?

下一篇: Python小技巧:凍結(jié)參數(shù),讓你的代碼變簡(jiǎn)潔

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Redmi Pad評(píng)測(cè):紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍(lán)牙耳機(jī)到筆記本電腦,紅米不知不覺之間也已經(jīng)形成了自己頗有競(jìng)爭(zhēng)力的產(chǎn)品體系,在中端和次旗艦市場(chǎng)上甚至要比小米新機(jī)的表現(xiàn)來得更好,正所謂“大丈夫生居
  • iPhone賣不動(dòng)了!蘋果股價(jià)創(chuàng)年內(nèi)最大日跌幅:市值一夜蒸發(fā)萬億元

    8月5日消息,今天凌晨美股三大指數(shù)高開低走集體收跌,道指跌0.41%;納指跌0.36%;標(biāo)普500指數(shù)跌0.52%。熱門科技股也都變化極大,其中蘋果報(bào)181.99美元,跌4.8%,創(chuàng)
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對(duì)Reader和Writer接口的組合,
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時(shí)間業(yè)務(wù)團(tuán)隊(duì)偶爾會(huì)碰到一些 Pulsar 使用的問題,比如消息阻塞不消費(fèi)了、生產(chǎn)者消息發(fā)送緩慢等各種問題。雖然我們有個(gè)監(jiān)控頁面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項(xiàng)目,添加 Spring Web 依賴項(xiàng),并單擊“生成”按鈕下載 .zip 文件,為下一步做準(zhǔn)備。請(qǐng)?jiān)谶M(jìn)入步驟2之前進(jìn)行解壓。圖
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會(huì)涉及各種各樣的安全任務(wù),包括但不限于:開發(fā)某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時(shí)間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進(jìn)展,其中榮耀、三星都已陸續(xù)發(fā)布了最新的折疊屏旗艦,尤其號(hào)榮耀Magi
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據(jù)官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 蘋果MacBook Pro 2021測(cè)試:仍不支持平滑滾動(dòng)

    據(jù)10月30日9to5 Mac 消息報(bào)道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯(cuò)的評(píng)價(jià),亮點(diǎn)包括行業(yè)領(lǐng)先的性能,令人印象深刻的電池續(xù)航,精美豐
Top 主站蜘蛛池模板: 岳池县| 双城市| 德安县| 祁阳县| 盈江县| 华池县| 神池县| 铁岭市| 合作市| 噶尔县| 辉南县| 开化县| 大姚县| 阳信县| 临洮县| 攀枝花市| 弋阳县| 天峻县| 池州市| 广元市| 台湾省| 遂昌县| 华坪县| 顺平县| 河津市| 廊坊市| 泾源县| 磴口县| 临桂县| 西峡县| 咸宁市| 仙居县| 松桃| 城口县| 京山县| 循化| 织金县| 枣强县| 监利县| 柯坪县| 溧阳市|