C:
การใช้แอเรย์สมาชิก
วิธีการ:
ภาษา C ไม่มีการสนับสนุนอาร์เรย์แบบผูกพันอย่างในตัวเหมือนภาษาระดับสูงอื่นๆ แต่คุณสามารถจำลองได้โดยใช้โครงสร้างและการแฮช ด้านล่างเป็นตัวอย่างง่ายๆ โดยใช้การรวมกันของ struct และฟังก์ชันแฮชที่ง่ายเพื่อสร้างอาร์เรย์แบบผูกพันสำหรับการจัดเก็บและเข้าถึงเลขจำนวนเต็มโดยใช้คีย์แบบสตริง
ก่อนอื่น, กำหนดโครงสร้างเพื่อแทนคู่คีย์-ค่าหนึ่งคู่และอีกอันหนึ่งเพื่อแทนอาร์เรย์แบบผูกพันเอง:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 128
typedef struct {
char* key;
int value;
} KeyValuePair;
typedef struct {
KeyValuePair* items[TABLE_SIZE];
} AssocArray;
unsigned int hash(char* key) {
unsigned long int value = 0;
unsigned int i = 0;
unsigned int key_len = strlen(key);
for (; i < key_len; ++i) {
value = value * 37 + key[i];
}
value = value % TABLE_SIZE;
return value;
}
void initArray(AssocArray* array) {
for (int i = 0; i < TABLE_SIZE; ++i) {
array->items[i] = NULL;
}
}
void insert(AssocArray* array, char* key, int value) {
unsigned int slot = hash(key);
KeyValuePair* item = (KeyValuePair*)malloc(sizeof(KeyValuePair));
item->key = strdup(key);
item->value = value;
array->items[slot] = item;
}
int find(AssocArray* array, char* key) {
unsigned int slot = hash(key);
if (array->items[slot]) {
return array->items[slot]->value;
}
return -1;
}
int main() {
AssocArray a;
initArray(&a);
insert(&a, "key1", 1);
insert(&a, "key2", 2);
printf("%d\n", find(&a, "key1")); // ผลลัพธ์: 1
printf("%d\n", find(&a, "key2")); // ผลลัพธ์: 2
return 0;
}
ตัวอย่างนี้สาธิตการดำเนินการพื้นฐาน: เริ่มต้นอาร์เรย์แบบผูกพัน, การแทรกคู่คีย์-ค่า, และหาค่าโดยใช้คีย์ โปรดทราบว่าโค้ดนี้ขาดการจัดการการชนกันและมีจุดประสงค์เพื่อการศึกษา
ศึกษาลึกซึ้ง
แนวคิดของอาร์เรย์แบบผูกพันมีมาก่อนภาษา C, แต่ลักษณะที่เป็นภาษาระดับต่ำของมันไม่ให้การสนับสนุนโดยตรงเป็นประเภทในตัว นี่ทำให้เกิดการเข้าใจลึกซึ้งยิ่งขึ้นเกี่ยวกับโครงสร้างข้อมูลและอัลกอริทึม รวมถึงกลไกแฮชสำหรับการแมปคีย์-ค่าอย่างมีประสิทธิภาพ หลายไลบรารีและเฟรมเวิร์กของภาษา C นำเสนอวิธีการที่สมบูรณ์ยิ่งขึ้นสำหรับการสร้างอาร์เรย์แบบผูกพัน เช่น GHashTable
ของ GLib ซึ่งให้การสนับสนุนการจัดการการชนกัน, การปรับขนาดไดนามิก, และสนับสนุนประเภทคีย์และค่าที่หลากหลาย
แม้ว่าการสร้างอาร์เรย์แบบผูกพันด้วยตัวเองในภาษา C อาจดูเหมือนลำบากเมื่อเปรียบเทียบกับภาษาที่มีการสนับสนุนในตัว แต่สิ่งนี้ให้ความเข้าใจอย่างลึกซึ้งเกี่ยวกับกลไกภายในของโครงสร้างข้อมูล ช่วยให้นักโปรแกรมเมอร์มีทักษะทางการแก้ปัญหาและการปรับปรุงประสิทธิภาพที่ดียิ่งขึ้น อย่างไรก็ดี, สำหรับโค้ดการผลิตหรือโปรแกรมที่ซับซ้อนมากขึ้น, การใช้ไลบรารีที่มีอยู่เช่น GLib มักเป็นวิธีที่ปฏิบัติและประหยัดเวลามากขึ้น