【C/C++語法基礎】6.結構體(新手推薦):揭開神秘面紗,探索C語言中的“樂高積木”

Eriktse0發表於2024-03-09

前言

你們是否曾在學習C/C++的道路上,對著螢幕陷入沉思,疑惑於如何將多個不同型別的資料捆綁在一起,組成一個有機的整體?是否曾在資料管理的海洋中迷失,渴望有一種“樂高積木”般的能力,可以讓你們隨心所欲地搭建屬於自己的資料結構?那麼,結構體,就是你們需要的答案!

什麼是結構體?

結構體,是C/C++語言中用於封裝不同資料型別的“容器”,就像一個神秘的寶盒,可以把我們想要在一起的東西收藏起來。它允許我們將多個不同型別的資料項組合成一個單一的實體,從而讓我們可以更加方便地管理和操作這些資料。

結構體如何使用?

結構體的使用非常簡單,首先,我們需要定義一個結構體型別,這可以透過使用關鍵字struct來實現。比如:

struct Person {
    char name[50];
    int age;
    float height;
};

這個Person結構體型別包含了三個資料項:一個字元陣列name用來儲存姓名,一個整型變數age用來儲存年齡,一個浮點型變數height用來儲存身高。

定義了結構體型別之後,我們就可以建立結構體變數了,就像這樣:

struct Person person1;

現在,我們有了一個person1變數,它可以儲存一個人的姓名、年齡和身高資訊。

真心給大家推薦由我主講的價效比超高的《演算法基礎課》,想要學習更多ACM/藍橋杯/CSP/NOIP演算法競賽知識,無論你是想要競賽拿獎的大學生、想要在筆試面試中脫穎而出、或者是對計算機程式設計感興趣的小朋友,都可以學習,一定不要錯過!點此瞭解(官方群:746470220):https://www.starrycoding.com/course/1

結構體有什麼用?

結構體的用途廣泛,它是C/C++程式設計中處理複雜資料的重要工具。比如,我們可以用結構體來建立一個學生資訊的列表,每個學生都有一個姓名、年齡和成績,透過結構體,我們就可以將這些資訊組織起來,方便地進行增刪改查操作。
結構體還有什麼需要注意的?
在使用結構體時,我們需要注意以下幾點:

  • 結構體中的資料項預設是按照它們在結構體定義中的順序儲存的,就像樂高積木的拼接,每一塊都按照順序放置。

  • 結構體變數的大小取決於其中最大資料項的大小,因為計算機記憶體是按照位元組分配的。

  • 結構體可以巢狀使用,也就是說,一個結構體中可以包含另一個結構體型別的資料項。

結構體排序

C++標準庫提供了多種排序演算法,其中最常用的是std::sort函式(需要引入<algorithm>標頭檔案)。這個函式可以對任意型別的序列進行排序,包括結構體。

要使用std::sort對結構體進行排序,你需要提供一個比較函式,或者過載結構體的小於號運算子。

假設我們有一個結構體Student,包含學生的姓名和成績:

struct Student {
    std::string name;
    int score;
};

我們想要對這個結構體陣列按照成績進行排序。首先,我們需要定義一個比較函式,用於比較兩個Student結構體的大小:

bool compareStudentsByScore(const Student& a, const Student& b) {
    return a.score < b.score;
}

這個函式返回true如果a的分數小於b的分數,否則返回false。這樣,std::sort會根據成績對結構體陣列進行升序排序。
接下來,我們可以這樣使用std::sort:

#include <algorithm>  // std::sort
#include <vector>     // std::vector
#include <iostream>   // std::cout, std::endl

int main() {
    std::vector<Student> students = {
        {"Alice", 90},
        {"Bob", 85},
        {"Charlie", 95}
    };

    std::sort(students.begin(), students.end(), compareStudentsByScore);

    for (const auto& student : students) {
        std::cout << "Name: " << student.name << ", Score: " << student.score << std::endl;
    }

    return 0;
}

相關文章