Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟังก์ชัน unique() ของ forward_list ใน C++ STL

forward_list::unique() คืออะไร?

forward_list::unique() เป็นฟังก์ชันในไลบรารีมาตรฐาน C++ ที่ใช้สำหรับ ลบองค์ประกอบซ้ำที่อยู่ติดกัน ออกจาก forward list สังเกตว่าองค์ประกอบจะถูกลบก็ต่อเมื่อเทียบเท่ากับองค์ประกอบที่อยู่ติดกันทันที (adjacent elements) ดังนั้น ฟังก์ชันนี้จึงมีประโยชน์อย่างยิ่งสำหรับ ลิสต์ที่เรียงลำดับแล้ว

ไวยากรณ์ (Syntax)

forwardlist_name.unique()                    // ใช้ operator== ในการเปรียบเทียบ
forwardlist_name.unique(binary_predicate)    // ใช้ binary predicate แบบกำหนดเอง

พารามิเตอร์ (Parameter)

ฟังก์ชันนี้รับพารามิเตอร์เดียวคือ binary predicate ซึ่งเป็นฟังก์ชันที่ส่งคืน true หากสององค์ประกอบควรถือว่าเท่ากัน

ไวยากรณ์ Binary Predicate

bool predicate_name(data_type a, data_type b);

ตัวอย่างการทำงาน

Input:  List: 4, 4, 17, 32, 45, 56, 56, 45, 32, 4, 17, 17
Output: Unique list: 4, 17, 32, 45, 56, 45, 32, 4, 17
(ลบเฉพาะค่าที่ซ้ำและอยู่ติดกัน: 4,4 → 4 และ 56,56 → 56 และ 17,17 → 17)

Input:  List: 15.2, 74.0, 3.14, 15.2, 69.5, 74.0, 3.14, 18.5, 3.99
Output: Unique list: 15.2, 74.0, 3.14, 15.2, 69.5, 74.0, 3.14, 18.5, 3.99
(ไม่มีค่าซ้ำที่อยู่ติดกัน จึงไม่มีการลบ)

สังเกต: ตัวอย่างต้นฉบับที่แสดง "Unique list: 4, 17, 32, 45, 56" เป็นการลบค่าซ้ำทั้งหมด (distinct) ซึ่ง ไม่ใช่** พฤติกรรมของ unique() unique() ลบเฉพาะค่าที่ซ้ำและอยู่ติดกันเท่านั้น หากต้องการลบค่าซ้ำทั้งหมด ต้องเรียงลำดับ (sort()) ก่อนแล้วค่อย unique()

แนวทางการเขียนโปรแกรม

  1. สร้างฟังก์ชัน binary predicate (ถ้าต้องการเปรียบเทียบแบบกำหนดเอง)
  2. กำหนดค่าเริ่มต้น forward list
  3. เรียกใช้ฟังก์ชัน unique()
  4. พิมพ์ forward list หลังการทำงาน unique()

ตัวอย่างโค้ดที่แก้ไขแล้ว

// C++ code to demonstrate the working of forward_list::unique()
#include <forward_list>
#include <iostream>
#include <cmath> // สำหรับ abs()
using namespace std;

// ฟังก์ชัน binary predicate: เปรียบเทียบค่าสัมบูรณ์
bool cmp(int a, int b) {
    return (abs(a) == abs(b));
}

int main() {
    // กำหนดค่าเริ่มต้น forward list
    forward_list<int> List = {2, 4, 6, 3, 5, 3, 4, 4, 9, 1, 6, 6, 2, 2, 9};
    cout << " องค์ประกอบของ List: ";
    for (auto x = List.begin(); x != List.end(); ++x)
        cout << *x << " ";
    // เรียกใช้ฟังก์ชัน unique() แบบไม่มี predicate (ใช้ ==)
    List.unique();
    cout << "\n Unique List (ลบซ้ำติดกัน): ";
    for (auto x = List.begin(); x != List.end(); ++x)
        cout << *x << " ";
    // ตัวอย่างใช้ binary predicate
    forward_list<int> List2 = {-2, 2, -3, 3, 4, -4};
    List2.unique(cmp); // ลบค่าที่มีค่าสัมบูรณ์เท่ากันและอยู่ติดกัน
    cout << "\n Unique List ด้วย predicate (ค่าสัมบูรณ์): ";
    for (auto x = List2.begin(); x != List2.end(); ++x)
        cout << *x << " ";
    return 0;
}

ผลลัพธ์ (Output)

องค์ประกอบของ List: 2 4 6 3 5 3 4 4 9 1 6 6 2 2 9
Unique List (ลบซ้ำติดกัน): 2 4 6 3 5 3 4 9 1 6 2 9
Unique List ด้วย predicate (ค่าสัมบูรณ์): -2 -3 3 4

สรุป: unique() ลบองค์ประกอบซ้ำที่อยู่ติดกัน (adjacent duplicates) เท่านั้น หากต้องการลบค่าซ้ำทั้งหมด ให้เรียก sort() ก่อนแล้วค่อย unique()