ฉันจะจัดเก็บการสะกด & รายการโดยใช้ std :: vector implementation ได้อย่างไร


10

ฉันกำลังติดตามพร้อมกับหนังสือจาก GameInstitute ในขณะนี้และขอให้ฉัน:

อนุญาตให้ผู้เล่นซื้อและพกยารักษาและยาลูกไฟ คุณสามารถเพิ่มอาร์เรย์ไอเท็ม (หลังจากที่คุณกำหนดคลาสไอเท็ม) ไปยังคลาสเพลเยอร์สำหรับการจัดเก็บหรือใช้ std :: vector เพื่อเก็บมัน

ฉันคิดว่าฉันต้องการใช้std::vectorการนำไปใช้เนื่องจากดูเหมือนว่าจะทำให้ฉันสับสนน้อยกว่าการสร้างคลาสไอเท็ม แต่ฉันไม่แน่ใจว่าจะทำอย่างไร ฉันได้ยินมาจากหลาย ๆ คนว่าเวกเตอร์เป็นวิธีที่ดีในการเก็บค่าแบบไดนามิก (เช่นรายการอาวุธ ฯลฯ ) แต่ฉันไม่เคยเห็นมันมาใช้


3
คุณจะต้องมีคลาสรายการในวิธีใดวิธีหนึ่ง อาร์เรย์ของไอเท็มจะเป็นไอเท็มไอเท็ม [INVENTORY_SIZE]; std :: vector ของไอเท็มจะเป็นstd :: vector <Item> items; std :: vector เป็นเพียงอาร์เรย์ที่ขนาดสามารถเปลี่ยนแปลงได้แบบไดนามิก
API-Beast

1
ในการจัดเก็บวัตถุในเวกเตอร์พวกเขาจะต้องเป็นวัตถุประเภทเดียวกัน วิธีการทำคือการสร้าง Item vector (โดยที่ Item เป็นอินเตอร์เฟสสำหรับรายการทั้งหมดที่สามารถหยิบขึ้นมาได้) และคลาสสำหรับแต่ละประเภทรายการของคุณ (potion การรักษาและ potion ลูกไฟ) ตราบใดที่คลาส potion ใช้ส่วนต่อประสาน Item คุณสามารถเก็บไว้ใน vector ได้ (แม้ว่าสิ่งจะซับซ้อนมากขึ้นคุณอาจต้องการเพิ่มส่วนต่อประสานเพิ่มเติมสำหรับสิ่งต่าง ๆ เช่นรายการบริโภค, รายการวางซ้อนกันได้หรือเพียงปรุงยาเองเท่านั้น หนึ่งคลาสต่อรายการและอินเทอร์เฟซรายการ)
Benjamin Danger Johnson

คำตอบ:


13

std::vectorเป็นวิธีที่ดีในการจัดเก็บ "ไดนามิก" (ตามที่คุณเรียกว่า) สิ่งต่าง ๆ เช่นรายการ แต่ประโยชน์ที่แท้จริงของเวกเตอร์ไม่ใช่สิ่งที่คุณจัดเก็บสามารถเปลี่ยนแปลงได้ แต่จำนวนรายการในเวกเตอร์สามารถเปลี่ยนแปลงได้โดยไม่น้อยที่สุด ในส่วนของคุณ เพื่อแสดงให้เห็นว่าคุณต้องจัดเก็บItemวัตถุของคุณเป็นอาร์เรย์คุณจะต้องแก้ไขขนาดของอาร์เรย์ในเวลารวบรวม ( Item items[SIZE];) ซึ่งหมายความว่าคุณมีขีด จำกัด สูงสุดคงที่ในรายการ (ในประเด็นอื่น ๆ ซึ่งไม่ได้เกิดขึ้น ' ไม่เกี่ยวข้องกับเรื่องเฉพาะนี้และฉันจะข้ามไป)

นอกจากนี้คุณยังสามารถจัดสรรอาเรย์แบบไดนามิกในขณะที่ ( Item * items = new Item[SIZE];) ซึ่งจะช่วยให้คุณปรับขนาดอาเรย์ในภายหลังโดยการจัดสรรพื้นที่เก็บข้อมูลใหม่คัดลอกรายการไปและลบที่เก็บเก่า อย่างไรก็ตามนี่เป็นงานอีกมากที่คุณต้องทำ

โชคดีที่มันมีประโยชน์อะไรstd::vectorกับคุณ - มันเป็นการใช้งานอาเรย์แบบไดนามิกขนาดเป็นหลักและจัดการการจัดการหน่วยความจำสำหรับการพัฒนาอาเรย์เกินความจุปัจจุบันของคุณ เป็นตัวเลือกที่ฉันขอแนะนำให้คุณติดตามในตอนนี้ แต่โปรดทราบว่าคุณยังต้องการสร้างItemชั้นเรียน

มันใช้งานง่ายมาก:

// Create an item list and two item objects to add to it.
std::vector<Item> items;
Item fireballPotion("Potion of Fireball");
Item healingPotion("Potion of Healing");

// Add the items:
items.push_back(fireballPotion);
items.push_back(healingPotion);

// operator[] is supported for accessing items.
// This will print "Potion of Fireball" for example:
std::cout << items[0].GetName();

เอกสาร MSDN สำหรับvectorชั้นเรียนนั้นน่าจะคุ้มค่าต่อการอ่านและหากคุณไม่คุ้นเคยกับแม่แบบซึ่งเป็นสิ่งที่vectorใช้เพื่อให้สามารถเก็บ "อะไรก็ได้" คุณควรปัดเศษข้อมูลพื้นฐานที่นั่นด้วย ซึ่งทำให้ฉันถึงจุดสุดท้าย: ในขณะที่มันดูเหมือนว่าเวกเตอร์สามารถเก็บอะไรก็ได้ แต่ก็มีข้อ จำกัด สำหรับสิ่งที่ได้รับอนุญาตและบางครั้งสิ่งเหล่านี้จะโยนผู้เริ่มต้น โดยเฉพาะอย่างยิ่งประเภทที่คุณจัดเก็บในเวกเตอร์จะต้องคัดลอกได้เนื่องจากเวกเตอร์จะต้องทำสำเนาของวัตถุเมื่อปรับขนาดที่เก็บข้อมูลภายในตัวอย่างเช่น กฎสามข้อของ C ++ นั้นเป็นสิ่งที่ควรคำนึงถึงที่นี่


ขอบคุณนี่ชัดเจนและรัดกุม ฉันกำลังอ่านเอกสารตอนนี้ - เมื่อฉันมีตัวแทน 15 คนฉันจะกลับมาและลงคะแนนให้คุณ!
Vladimir Marenus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.