string_view คืออะไร


162

string_viewเป็นคุณลักษณะที่เสนอภายใน C ++ Library Fundamentals TS ( N3921 ) เพิ่มใน C ++ 17

เท่าที่ฉันเข้าใจมันเป็นประเภทที่เป็นตัวแทนของสตริง "แนวคิด" บางอย่างที่เป็นมุมมองของภาชนะประเภทใด ๆ ที่สามารถเก็บสิ่งที่ดูได้เป็นสตริง

  • ถูกต้องหรือไม่
  • ควรเป็นconst std::string&พารามิเตอร์แบบบัญญัติ string_viewหรือไม่
  • มีประเด็นสำคัญอีกข้อหนึ่งที่string_viewต้องพิจารณาหรือไม่?

4
ในที่สุดบางคนก็ตระหนักว่าสตริงต้องการซีแมนทิกส์ที่แตกต่างกันแม้ว่าการแนะนำ string_view เป็นเพียงขั้นตอนเล็ก ๆ
John Z. Li

คำตอบ:


183

วัตถุประสงค์ของข้อเสนอ "อ้างอิงสตริง" และ "อ้างอิงอาร์เรย์" ทุกประเภทคือเพื่อหลีกเลี่ยงการคัดลอกข้อมูลที่มีอยู่แล้วในที่อื่นและต้องใช้มุมมองที่ไม่กลายพันธุ์เท่านั้น string_viewในคำถามเป็นหนึ่งในข้อเสนอดังกล่าว มีคนก่อนหน้านี้ที่เรียกว่าstring_refและarray_refเช่นกัน

แนวคิดนี้จะเก็บคู่ของตัวชี้ไปยังองค์ประกอบและขนาดของอาร์เรย์ข้อมูลหรือสตริงที่มีอยู่บางคู่เสมอ

คลาส view-handle ดังกล่าวสามารถส่งผ่านได้อย่างถูกตามค่าและจะเสนอการดำเนินการ substringing ราคาถูก (ซึ่งสามารถนำไปใช้เป็นการเพิ่มตัวชี้ง่ายและการปรับขนาด)

การใช้สตริงจำนวนมากไม่ต้องการการเป็นเจ้าของสตริงอย่างแท้จริงและสตริงที่เป็นปัญหามักจะเป็นของบุคคลอื่นอยู่แล้ว ดังนั้นจึงมีศักยภาพที่แท้จริงสำหรับการเพิ่มประสิทธิภาพโดยการหลีกเลี่ยงสำเนาที่ไม่จำเป็น (ลองนึกถึงการจัดสรรและข้อยกเว้นทั้งหมดที่คุณสามารถบันทึกได้)

สตริง C ดั้งเดิมประสบปัญหาที่ตัวยกเลิก null เป็นส่วนหนึ่งของ API สตริงดังนั้นคุณจึงไม่สามารถสร้างสตริงย่อยได้อย่างง่ายดายโดยไม่ต้องกลายพันธุ์สตริงพื้นฐาน (a strtok) ใน C ++ สิ่งนี้สามารถแก้ไขได้อย่างง่ายดายโดยการจัดเก็บความยาวแยกจากกันและห่อตัวชี้และขนาดไว้ในคลาสเดียว

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


19
เรือแล่นไปตามปรัชญานั้นด้วยreference_wrapperใช่ไหม?
Steve Jessop

5
@ KerrekSB ฉันกลัวว่าฉันจะไม่ทำตาม คุณสามารถขยายใน"คลาสมุมมองการอ้างอิงดังกล่าวมีความหมายที่แตกต่างอย่างสิ้นเชิงจากส่วนที่เหลือของไลบรารีมาตรฐาน" ได้ไหม ไม่ชัดเจนสำหรับฉัน: มันแตกต่างจาก dangling References / pointers อย่างไร? หรือตัววนซ้ำที่ไม่ถูกต้องเนื่องจากการแทรก (เช่น std :: vector)? เรามีปัญหาเหล่านี้อยู่แล้วมันเป็นเรื่องธรรมดามากสำหรับฉันที่มุมมองที่ไม่ใช่เจ้าของจะมีปัญหาที่คล้ายกันกับตัวชี้ / การอ้างอิง / ตัววนซ้ำที่ไม่ใช่เจ้าของ
Ali

5
@Ali: เมื่อคุณใช้คอนเทนเนอร์ไลบรารีมาตรฐานอื่น ๆ คุณสามารถยืนยันความถูกต้องของรหัสได้เพียงแค่ดูรหัสที่ใช้คอนเทนเนอร์ ไม่เป็นเช่นstring_viewนั้น (ฉันไม่ได้บอกว่าคุณไม่สามารถเขียนรหัสที่ขาดได้เพียงว่าความเสียหายนั้นเป็นของท้องถิ่น )
Kerrek SB

6
ฉันประหลาดใจที่พวกเขาไม่ได้ไปด้วยstd::rangeจากboost::iterator_range- IMO จะดีกว่าความคิด string_view
ชาร์ลส์ซัลเวีย

19
@nwp: ผู้คนและภาษาจำนวนมากเริ่มเสียใจกับค่าเริ่มต้นที่น่ากลัวของ C ++ และคิดว่า "const" และ "unshared" ควรเป็นค่าเริ่มต้นโดยมี "mutable" และ "shared" ข้อยกเว้นที่ชัดเจนและหายาก
Kerrek SB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.