คำถามนี้อธิบายได้ด้วยตัวเองจริงๆ ฉันรู้รางเกี่ยวกับเวกเตอร์ในคณิตศาสตร์ แต่ฉันไม่เห็นลิงก์ไปยังเวกเตอร์ C ++
คำถามนี้อธิบายได้ด้วยตัวเองจริงๆ ฉันรู้รางเกี่ยวกับเวกเตอร์ในคณิตศาสตร์ แต่ฉันไม่เห็นลิงก์ไปยังเวกเตอร์ C ++
คำตอบ:
นิยามทางคณิตศาสตร์ของเวกเตอร์เป็นสมาชิกของเซตS
n
ซึ่งเป็นลำดับของค่าในชุดเฉพาะ ( S
) นี่คือสิ่งที่vector
ร้านค้าC ++
std::vector
ไม่ได้ให้ 3. การโต้แย้งที่std::vector
เป็นลำดับของค่าสามารถนำไปใช้std::list
, std::deque
, std::basic_string
ฯลฯ
มันเรียกว่าเวกเตอร์เพราะ Alex Stepanov ผู้ออกแบบไลบรารีแม่แบบมาตรฐานกำลังมองหาชื่อที่จะแยกแยะมันออกจากอาร์เรย์ในตัว ตอนนี้เขายอมรับว่าเขาทำผิดเพราะคณิตศาสตร์ใช้คำว่า 'เวกเตอร์' สำหรับลำดับตัวเลขที่มีความยาวคงที่แล้ว C ++ 11 แก้ไขข้อผิดพลาดนี้โดยการแนะนำ 'อาเรย์' ของคลาสที่มีพฤติกรรมคล้ายกับเวกเตอร์ทางคณิตศาสตร์
บทเรียนของ Alex โปรดระวังทุกครั้งที่คุณตั้งชื่อบางอย่าง
ข้อความที่ตัดตอนมาจากภาษาการเขียนโปรแกรม C ++โดย Bjarne Stroustrup:
"ใคร ๆ ก็อาจโต้แย้งได้ว่าวาลาเรย์ ควรจะถูกเรียกว่าเวกเตอร์ เพราะมันเป็นเวกเตอร์คณิตศาสตร์แบบดั้งเดิมและเวกเตอร์ นั้นควรถูกเรียกว่าอาเรย์อย่างไรก็ตามนี่ไม่ใช่วิธีที่วิวัฒนาการของคำศัพท์"
ชื่อมาจากพีชคณิตเชิงเส้นโดยที่เวกเตอร์เป็นเมทริกซ์ที่มีเพียงหนึ่งคอลัมน์หรือเพียงหนึ่งแถว
เพียงเพื่อบอกว่าทำไมจึงไม่อาจเรียกได้ว่าarray
: เพราะstd::vector
มีขนาดแบบไดนามิก อาร์เรย์แนวคิดถูกกำหนดความยาว มาตรฐาน C ++ ถัดไปโดยวิธีมีstd::array
แม่แบบซึ่งได้รับการแก้ไขในขนาดและควรจะต้องมากกว่าอาร์เรย์ธรรมดา:
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
จะไม่ดี
เพื่อเสริมการตอบสนองที่ยอดเยี่ยมจาก @MarkRuzon:
อเล็กซ์กล่าวว่าเพื่อให้ชื่อกับสิ่งที่เรียกว่า std :: vector เขาสังเกตเห็นชื่อที่SchemeและCommon LISPให้กับโครงสร้างข้อมูลที่คล้ายกัน
ต่อมาเขายอมรับว่าเขาผิดเพราะเวกเตอร์C ++ไม่มีส่วนเกี่ยวข้องกับเวกเตอร์ในวิชาคณิตศาสตร์
นอกจากนี้เขายังกล่าวว่าเขาแนะนำข้อผิดพลาดของชุมชน 50 คนในชุมชน 5 ล้านคนดังนั้นข้อผิดพลาดน่าจะยังคงอยู่ตลอดไป
มันเป็นเพียงชื่อ c ++ เวกเตอร์ได้เป็นอย่างดี (หรือแม้กระทั่งถูกต้องมากขึ้น) จะเรียกว่าอาร์เรย์แบบไดนามิกหรืออาร์เรย์ปรับขนาดได้แต่ชื่อนี้เป็นเพียงการได้รับการแต่งตั้ง นี้เวกเตอร์ไม่ได้เป็นเช่นเดียวกับเวกเตอร์จาก methematics เพราะในวิชาคณิตศาสตร์เวกเตอร์เป็นสมาชิกของใด ๆ ชุดVดังกล่าวว่ามีสองสิ่งที่สำคัญการดำเนินงานที่กำหนดไว้ในชุดนี้: + (นอกจากของเวกเตอร์) และx (คูณของเวกเตอร์โดยเกลาจากฟิลด์F ) และการดำเนินการเหล่านี้เป็นไปตามหลักการ 8 ประการ :
ความเกี่ยวข้องของการเพิ่ม
u + (v + w) = (u + v) + w
การเปลี่ยนของการเติม
u + v = v + u
องค์ประกอบประจำตัวของการเพิ่ม
มีองค์ประกอบที่มีอยู่ 0 ∈ Vเรียกว่าเวกเตอร์ศูนย์เช่นว่า V + 0 = V สำหรับทุกวี∈ V
องค์ประกอบผกผันของการเพิ่ม
สำหรับ v ∈ V ทุกครั้งจะมีองค์ประกอบ −v ∈ V ที่เรียกว่าการเพิ่มค่าผกผันของ v เช่นนั้น v + (−v) = 0
ความเข้ากันได้ของการคูณสเกลาร์กับการคูณฟิลด์
a (bv) = (ab) v
องค์ประกอบตัวตนของการคูณสเกลาร์
1 v = V ที่1หมายถึงตัวตนคูณในF
การกระจายตัวของการคูณสเกลาร์เทียบกับการเพิ่มเวกเตอร์
a (u + v) = au + av
การกระจายตัวของการคูณสเกลาร์เมื่อเทียบกับการเพิ่มสนาม
(a + b) v = av + bv
C ++ std::vector
สนับสนุนทั้งหมดของพวกเขา (ไม่ใช่โดยตรง แต่ผ่านคุณสมบัติ C ++) ดังนั้นมันจึงสามารถเรียกได้ว่าเวกเตอร์ แต่มันก็เป็นแค่ภาษาพูดและตัวอย่างเช่นVallaray
Bjarne Stroustrup ใน"ภาษาโปรแกรม C ++"สนับสนุนบางส่วนโดยตรง
std::vector
std::vector
ดังนั้น a จึงstd::vector
ไม่มีคุณสมบัติเป็นเวกเตอร์ ฉันจะได้เรียกมันdynamic_array
หรือresizable_array
ที่จะบอกคุณว่ามันคืออะไร
เวกเตอร์เป็นเพียงลำดับของค่าทุกประเภทเดียวกัน มันค่อนข้างสอดคล้องกับการใช้งานทางคณิตศาสตร์มาก ฉันเดาว่าความคิดทางคณิตศาสตร์ที่เวกเตอร์ควรสนับสนุนการดำเนินการทั่วไปบางอย่าง (เช่นการเพิ่มและการขยายด้วยสเกลาร์) ไม่ได้ถูกนำมาใช้สิ่งสำคัญคือโครงสร้าง
นอกจากนี้หากคุณทำให้มันเก็บจำนวนเต็มหรือจุดลอยตัวมันจะทำให้เป็นประเภทที่ยอดเยี่ยมสำหรับการจัดเก็บเวกเตอร์มิติ N ท้ายสุดเวกเตอร์ทั้งหมดคือรายการหมายเลขที่เก็บไว้ในลำดับเฉพาะ
0.1
ในทางคณิตศาสตร์ค่านี้เป็นสมาชิกของชุดจำนวนจริง ในภาษาการเขียนโปรแกรม Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) เวกเตอร์คือ "คลาส Vector ใช้อาร์เรย์ของวัตถุที่เติบโตได้เช่นเดียวกับอาร์เรย์มันมีส่วนประกอบที่ สามารถเข้าถึงได้โดยใช้ดัชนีจำนวนเต็มอย่างไรก็ตามขนาดของ Vector สามารถเพิ่มหรือลดขนาดได้ตามต้องการเพื่อรองรับการเพิ่มและลบรายการหลังจากสร้าง Vector แล้ว "
นานมาแล้วในภาษา Bมีประเภทเวกเตอร์ จากนั้นภาษา C เรียกว่า "อาร์เรย์" จากนั้น C ที่มีคลาสและภาษา C ++ เพิ่งได้รับ ...
นี่ไม่ใช่เรื่องราวทั้งหมดอย่างแน่นอน ดังที่ได้กล่าวมาแล้ว Stepanov ได้ทำการตัดสินใจจริง แต่ถ้า "vector" ยังคงถูกใช้ใน C ผลลัพธ์อาจจะดูแตกต่างออกไป
PS ฉันสงสัยว่าทำไม C เปลี่ยนชื่อเป็น "อาร์เรย์" อะไรคือเหตุผลที่แน่นอน
PS2 IMO สำหรับภาษา C + +, อาเรย์เป็นความหมายที่ดีกว่า "ประเภทการเก็บองค์ประกอบที่จะเข้าถึงได้อย่างสมเหตุสมผลผ่านโอเปอเรเตอร์ []" (เช่นไม่ใช่ 42 [some_array_object]) เช่นการสร้างอินสแตนซ์ของ std :: map ในฐานะ
แต่เวกเตอร์เชิงคณิตศาสตร์ไม่ใช่แบบไดนามิกฉันไม่เคยเห็นการเปลี่ยนแปลงอย่างใดอย่างหนึ่งจาก 2D เป็น 3D หรืออย่างอื่นถ้าอาร์เรย์แบบดั้งเดิมใดที่ทำให้เวกเตอร์ดีขึ้น
ไม่มีความคิดเกี่ยวกับเหตุผลที่แท้จริง แต่ C ++ เรียกมันว่าเวกเตอร์แทนอาร์เรย์ช่วยลดความสับสนระหว่างโครงสร้าง C และ C ++ แม้ว่าพวกเขาจะทำหน้าที่เดียวกัน
คิดว่าเวกเตอร์ C ++ เป็นอาร์เรย์แบบไดนามิกซึ่งขนาดสามารถเปลี่ยนแปลงได้โดยการแทรกหรือลบองค์ประกอบ พวกมันไม่เกี่ยวข้องกับนิยามทางคณิตศาสตร์ของเวกเตอร์
เวกเตอร์ในวิชาคณิตศาสตร์
พิจารณาnxm
เมทริกซ์ที่เรียกว่าA
ซึ่งn
สอดคล้องกับจำนวนแถวและm
สอดคล้องกับจำนวนคอลัมน์ ในบริบททางคณิตศาสตร์เมื่อคุณแนะนำเมทริกซ์เช่นนี้จากนั้นคุณจะไม่สามารถดำเนินการใด ๆ นอกA
ช่วงที่กำหนดและคุณไม่สามารถขยายA
ขนาดได้เช่นกัน สิ่งที่หมายถึงนี้ก็คือคุณไม่สามารถอ้างถึงดัชนีของและ[n + 1]
/ หรือ[m + 1]
ทีนี้เวกเตอร์ที่ได้A
มาจะมีคุณสมบัติเหล่านี้เช่นกันในขณะที่ขนาดของมันจะเป็น1xm
( [i]
แถวใดก็ได้ที่เลือกภายในA
) หรือnx1
( [j]
คอลัมน์ใด ๆ ที่เลือกภายในA
) เวกเตอร์ไม่สามารถระบุได้เช่น2xn
กันเนื่องจากชุดของเวกเตอร์ไม่สามารถตีความได้ว่าเป็นหนึ่งเวกเตอร์ในขณะที่เวกเตอร์หนึ่ง - ให้นั่นคือ[i]
เวกเตอร์คอลัมน์ของที่A
มีขนาดของ1xm
- สามารถตีความได้ว่าเป็นเมทริกซ์
สิ่งที่สำคัญคือคุณไม่สามารถเปลี่ยนขนาดของเวกเตอร์ได้เมื่อมันถูกนำมาใช้ในเชิงคณิตศาสตร์
เวกเตอร์ใน C ++
ใน C ++ เวกเตอร์ก็เหมือนกับเวกเตอร์ในคณิตศาสตร์ แต่ไม่เหมือนกับคณิตศาสตร์ที่ขนาดของมันสามารถเปลี่ยนแปลงได้ ขนาดเป็นคำที่ใช้ที่นี่เพราะมันหมายถึงองค์ประกอบที่เวกเตอร์หนึ่งมี
คุณสามารถใช้มิติระยะในแง่ของภาษา C ++ std::vector<std::vector<T>>> ragged_array
เวกเตอร์เมื่อคุณมีเวกเตอร์ของเวกเตอร์: ในตัวอย่างนี้ฉันเรียกเวกเตอร์นั้นว่า "ragged" เพราะมันแสดงให้เห็นว่าขนาดของแต่ละเวกเตอร์ของเวกเตอร์นั้นสามารถเปลี่ยนแปลงได้อย่างอิสระ ไม่เพียง แต่ละเมิดกฎว่ามิติไม่สามารถเปลี่ยนแปลงได้เมื่อมีการแนะนำเวกเตอร์เฉพาะในคณิตศาสตร์ แต่ยังแสดงให้เห็นว่ามันไม่สามารถใช้เป็นเมทริกซ์ได้
สิ่งมหัศจรรย์ที่การตั้งชื่อพารามิเตอร์ให้กับชื่อมีดังนี้ ..
ที่นี่คอลัมน์จะถูกทำลาย .. (ดูแหล่งที่มาสำหรับทักษะการเข้ารหัส HTML ฝั่งเซิร์ฟเวอร์)
หรือว่าเป็นแถว?
จากนั้นอีกครั้งให้คิดถึงมันใน MIMD หรือบริบทของเครื่องเวกเตอร์ SSE ชื่อยังคงฟังดูดี
มันมาจากโครงสร้างของเมทริกซ์ที่สร้างจากเวกเตอร์