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

ความแตกต่างระหว่าง vector::resize() และ vector::reserve() ใน C++

Vector มีความสามารถปรับขนาดอัตโนมัติเหมือน dynamic arrays เมื่อมีการแทรกหรือลบสมาชิก Container จะจัดการหน่วยความจำโดยอัตโนมัติ

ความแตกต่างหลักระหว่าง resize() และ reserve() คือ resize() ใช้เปลี่ยนขนาด (size) ของ vector ส่วน reserve() ไม่เปลี่ยนขนาด reserve() ใช้เพื่อจองพื้นที่หน่วยความจำให้รองรับจำนวนสมาชิกที่ระบุไว้ล่วงหน้า โดยไม่ต้อง reallocate memory ส่วน resize() หากระบุขนาดน้อยกว่าปัจจุบัน จะลดขนาดหน่วยความจำและลบพื้นที่เกินออกไป

vector::resize()

ใช้เปลี่ยนขนาด (size) ของ vector

ตัวอย่าง

ขั้นตอนในโค้ดต้นฉบับ:

เริ่มต้น
  ประกาศตัวแปร v เป็น vector
  ประกาศตัวแปร it เป็น iterator ของ vector
  ประกาศตัวแปร c และ i เป็น integer
  while (1) ทำ
    แสดง "1. ขนาดของ Vector"
    แสดง "2. แทรกสมาชิกเข้า Vector"
    แสดง "3. ปรับขนาด Vector (Resize)"
    แสดง "4. แสดงด้วย Iterator"
    แสดง "5. ออก"
    แสดง "เลือกเมนู: "
    รับค่าตัวแปร c
    Switch(c)
      Case 1: แสดง "ขนาดของ Vector: " เรียก size()
      Case 2: แสดง "ใส่ค่าที่ต้องการแทรก: " รับค่า i เรียก push_back()
      Case 3: แสดง "ปรับขนาด vector:" เรียก resize(4)
      Case 4: แสดง "แสดง Vector ด้วย Iterator: " วนลูป iterator แสดงค่า
      Case 5: เรียก exit()
      Default: แสดง "ตัวเลือกผิด"
สิ้นสุด

โค้ดตัวอย่าง

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v;
    vector<int>::iterator it;
    int c, i;
    while (1) {
        cout << "1. ขนาดของ Vector" << endl;
        cout << "2. แทรกสมาชิกเข้า Vector" << endl;
        cout << "3. ปรับขนาด Vector" << endl;
        cout << "4. แสดงด้วย Iterator" << endl;
        cout << "5. ออก" << endl;
        cout << "เลือกเมนู: ";
        cin >> c;
        switch(c) {
            case 1:
                cout << "ขนาดของ Vector: ";
                cout << v.size() << endl;
                break;
            case 2:
                cout << "ใส่ค่าที่ต้องการแทรก: ";
                cin >> i;
                v.push_back(i);
                break;
            case 3:
                cout << "ปรับขนาด vector:" << endl;
                v.resize(4);
                break;
            case 4:
                cout << "แสดง Vector ด้วย Iterator: ";
                for (it = v.begin(); it != v.end(); it++)
                    cout << *it << " ";
                cout << endl;
                break;
            case 5:
                exit(1);
                break;
            default:
                cout << "ตัวเลือกผิด" << endl;
        }
    }
    return 0;
}

ผลลัพธ์ตัวอย่าง

1. ขนาดของ Vector
2. แทรกสมาชิกเข้า Vector
3. ปรับขนาด Vector
4. แสดงด้วย Iterator
5. ออก
เลือกเมนู: 1
ขนาดของ Vector: 0
...
(ตัวอย่างการทำงานแบบโต้ตอบ - เมื่อ resize(4) ขนาดจะกลายเป็น 4 และสมาชิกเกินจะถูกลบ)

vector::reserve()

reserve() ใช้บ่งชี้ว่า vector ควรจองพื้นที่หน่วยความจำให้รองรับจำนวนสมาชิกที่ระบุไว้ล่วงหน้า โดยไม่ต้อง reallocate memory

ขั้นตอนในโค้ดต้นฉบับ

เริ่มต้น
  ประกาศตัวแปร v เป็น vector
  ประกาศตัวแปร it เป็น iterator ของ vector
  ประกาศตัวแปร c และ i เป็น integer
  while (TRUE) ทำ
    แสดง "1. ขนาดของ Vector"
    แสดง "2. แทรกสมาชิกเข้า Vector"
    แสดง "3. จองพื้นที่ Vector (Reserve)"
    แสดง "4. แสดงด้วย Iterator"
    แสดง "5. ออก"
    แสดง "เลือกเมนู: "
    รับค่าตัวแปร c
    Switch(c)
      Case 1: แสดง "ขนาดของ Vector: " เรียก size()
      Case 2: แสดง "ใส่ค่าที่ต้องการแทรก: " รับค่า i เรียก push_back()
      Case 3: แสดง "จองพื้นที่ vector:" เรียก reserve(100)
      Case 4: แสดง "แสดง Vector ด้วย Iterator: " วนลูป iterator แสดงค่า
      Case 5: เรียก exit()
      Default: แสดง "ตัวเลือกผิด"
สิ้นสุด

โค้ดตัวอย่าง

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v;
    vector<int>::iterator it;
    int c, i;
    while (1) {
        cout << "1. ขนาดของ Vector" << endl;
        cout << "2. แทรกสมาชิกเข้า Vector" << endl;
        cout << "3. จองพื้นที่ Vector (Reserve)" << endl;
        cout << "4. แสดงด้วย Iterator" << endl;
        cout << "5. ออก" << endl;
        cout << "เลือกเมนู: ";
        cin >> c;
        switch(c) {
            case 1:
                cout << "ขนาดของ Vector: ";
                cout << v.size() << endl;
                break;
            case 2:
                cout << "ใส่ค่าที่ต้องการแทรก: ";
                cin >> i;
                v.push_back(i);
                break;
            case 3:
                cout << "จองพื้นที่ vector:" << endl;
                v.reserve(100);
                break;
            case 4:
                cout << "แสดง Vector ด้วย Iterator: ";
                for (it = v.begin(); it != v.end(); it++) {
                    cout << *it << " ";
                }
                cout << endl;
                break;
            case 5:
                exit(1);
                break;
            default:
                cout << "ตัวเลือกผิด" << endl;
        }
    }
    return 0;
}

ผลลัพธ์ตัวอย่าง

1. ขนาดของ Vector
2. แทรกสมาชิกเข้า Vector
3. จองพื้นที่ Vector (Reserve)
4. แสดงด้วย Iterator
5. ออก
เลือกเมนู: 1
ขนาดของ Vector: 0
...
(ตัวอย่างการทำงานแบบโต้ตอบ - reserve(100) ไม่เปลี่ยน size แต่เพิ่ม capacity)