มุมมองสตริงใน C ++

Mum Mxng String Ni C



ในขอบเขตของการเขียนโปรแกรม C++ การจัดลำดับความสำคัญของประสิทธิภาพและประสิทธิภาพถือเป็นสิ่งสำคัญ คลาส “std::string_view” เปิดตัวใน C++17 นำเสนอทางเลือกที่หลากหลายและมีประสิทธิภาพหน่วยความจำ แทนการจัดการสตริงแบบดั้งเดิม โดยพื้นฐานแล้ว “std::string_view” คือการอ้างอิงโดยไม่ได้เป็นเจ้าของถึงลำดับอักขระ ซึ่งโดยทั่วไปจะแสดงถึงสตริงย่อยของสตริงที่มีขนาดใหญ่กว่า ต่างจาก “std::string” ซึ่งเป็นเจ้าของข้อมูลและจัดการหน่วยความจำภายใน “std::string_view” ทำงานโดยไม่ต้องเป็นเจ้าของข้อมูลพื้นฐาน คุณลักษณะนี้ทำให้มีคุณค่าอย่างยิ่งสำหรับสถานการณ์ที่ค่าใช้จ่ายในการคัดลอกหรือการจัดการหน่วยความจำไม่เป็นที่พึงปรารถนา ในบทความนี้ เราจะสำรวจตัวอย่างต่างๆ เพื่อทำความเข้าใจการใช้งาน “std::string_view” ใน C++

ตัวอย่างที่ 1: การจัดการสตริงที่มีประสิทธิภาพ

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







พิจารณาข้อมูลโค้ดต่อไปนี้:



#รวม
#รวม

กระบวนการ StringView เป็นโมฆะ ( มาตรฐาน::string_view strView ) {

มาตรฐาน::cout << 'ความยาว: ' << strView.ความยาว ( ) << มาตรฐาน::endl;
มาตรฐาน::cout << 'เนื้อหา: ' << strView << มาตรฐาน::endl;
}

int หลัก ( ) {

std::string originalString = “การจัดการสตริงอย่างมีประสิทธิภาพ” ;

มาตรฐาน::string_view viewOfString ( ต้นฉบับสตริง ) ;

กระบวนการStringView ( viewOfString ) ;

กลับ 0 ;
}


ในตัวอย่างนี้ เรามีฟังก์ชัน 'processStringView' ที่ใช้ 'std::string_view' เป็นพารามิเตอร์ จากนั้นฟังก์ชันจะพิมพ์ความยาวและเนื้อหาของมุมมองสตริงโดยใช้เอาต์พุตมาตรฐาน ฟังก์ชั่นหลักเริ่มต้น 'std::string' ชื่อ 'OriginalString' ด้วยค่า 'Efficient String Handling' ต่อมา “std::string_view” ชื่อ 'viewOfString” จะถูกสร้างขึ้น โดยอ้างอิงถึงเนื้อหาของ “OriginalString”



การส่งผ่าน 'viewOfString' ไปยังฟังก์ชัน 'processStringView' ทำให้เราสามารถดำเนินการกับสตริงได้อย่างมีประสิทธิภาพ โดยไม่จำเป็นต้องจัดสรรหน่วยความจำเพิ่มเติม “std::string_view” เป็นการอ้างอิงแบบเบาๆ ไปยังลำดับอักขระที่ซ่อนอยู่ของ “OriginalString” โดยไม่ต้องคัดลอกข้อมูล





นี่คือผลลัพธ์ที่สร้างขึ้น:



ตัวอย่างที่ 2: การทำงานร่วมกันกับรหัสเดิม

ในขอบเขตของการพัฒนา C++ การบูรณาการอย่างราบรื่นของฐานโค้ดใหม่และเก่ามักเป็นปัญหาที่สำคัญ “std::string_view” ช่วยให้นักพัฒนาสามารถโต้ตอบได้อย่างง่ายดายกับฟังก์ชันดั้งเดิมที่ส่งคืนตัวชี้ “const char”

พิจารณาตัวอย่างต่อไปนี้ที่แสดงให้เห็นถึงการใช้งานจริงของ “std::string_view” สำหรับการทำงานร่วมกัน ที่นี่ เรามีฟังก์ชันแบบเดิมชื่อ 'legacyFunction()' ซึ่งส่งคืนตัวชี้ 'const char':

#รวม
#รวม

ถ่าน const * ฟังก์ชันมรดก ( ) {
กลับ “สายมรดก” ;
}

int หลัก ( ) {

std::string_view ดั้งเดิมStrView ( ฟังก์ชันมรดก ( ) ) ;

มาตรฐาน::cout << 'มุมมองสตริงดั้งเดิม: ' << มรดกStrView << มาตรฐาน::endl;

กลับ 0 ;
}


เราเริ่มต้นด้วยการกำหนดฟังก์ชันดั้งเดิมชื่อ 'legacyFunction()' ซึ่งจะส่งคืนตัวชี้ 'const char' ที่แสดงถึงสตริงที่มีป้ายกำกับว่า 'Legacy String' เพื่อรวมข้อมูลเดิมนี้เข้ากับโปรแกรม C++ สมัยใหม่ของเราได้อย่างราบรื่น เราใช้ 'std::string_view' ในฟังก์ชัน main() โดยเฉพาะ เราสร้างอินสแตนซ์ของ “std::string_view” ชื่อ “legacyStrView” และเริ่มต้นด้วยผลลัพธ์ของฟังก์ชันเดิม การสร้างอินสแตนซ์นี้ช่วยให้เราสามารถสรุปและทำงานกับตัวชี้ 'const char' แบบเดิมได้อย่างมีประสิทธิภาพ

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

ผลลัพธ์ที่ดำเนินการคือ:

ตัวอย่างที่ 3: ปรับปรุงการจัดการตัวอักษรสตริง

ตัวอักษรสตริงใน C ++ มักจะแสดงเป็นอาร์เรย์ของอักขระ “std::string_view” ช่วยลดความยุ่งยากในการทำงานกับตัวอักษรสตริงโดยจัดให้มีอินเทอร์เฟซที่สะดวก ด้วยการอนุญาตให้เข้าถึงโดยตรงไปยังอาร์เรย์อักขระที่ซ่อนอยู่โดยไม่จำเป็นต้องแปลงอย่างชัดเจน “std::string_view” จึงเพิ่มความคล่องตัวในการดำเนินการกับตัวอักษรสตริง

#รวม
#รวม

int หลัก ( ) {
ถ่าน const * myLiteral = “สวัสดีสตริงวิว!” ;
std::string_view literalView ( myLiteral ) ;

มาตรฐาน::cout << 'อักขระตัวแรก: ' << มุมมองตามตัวอักษร [ 0 ] << มาตรฐาน::endl;

ตำแหน่ง size_t = literalView.find ( 'สตริง' ) ;
มาตรฐาน::cout << 'ตำแหน่งของสตริงย่อย: ' << ตำแหน่ง << มาตรฐาน::endl;

กลับ 0 ;
}


ในตัวอย่างนี้ “สวัสดี มุมมองสตริง!” สตริงลิเทอรัลถูกกำหนดให้กับตัวชี้ 'myLiteral' การแนะนำ 'std::string_view' ช่วยให้การแสดงสตริงนี้มีประสิทธิภาพมากขึ้นโดยไม่จำเป็นต้องคัดลอกเนื้อหา วัตถุ 'literalView' ถูกสร้างขึ้นโดยใช้ตัวชี้ 'myLiteral' ซึ่งช่วยให้เราสามารถดูและจัดการลำดับอักขระที่ซ่อนอยู่ได้

การใช้ “std::string_view” ช่วยให้เข้าถึงอักขระแต่ละตัวภายในสตริงได้ง่าย ในข้อมูลโค้ด “literalView[0]” จะดึงข้อมูลและพิมพ์อักขระตัวแรกของสตริง แสดงให้เห็นถึงความเรียบง่ายและความตรงในการเข้าถึงองค์ประกอบต่างๆ ใช้เมธอด 'find' ของ 'std::string_view' เพื่อกำหนดตำแหน่งของสตริงย่อย 'String' ภายในสตริงต้นฉบับ

ตัวอย่างที่ 4: การแยกสตริงย่อย

งานการแยกสตริงย่อยเกี่ยวข้องกับการดึงส่วนของสตริงที่กำหนดตามเกณฑ์ที่ระบุ เช่น ตำแหน่งของตัวคั่น ความสามารถในการแยกสตริงย่อยได้อย่างง่ายดายเป็นคุณสมบัติอันทรงพลังของ “std::string_view” พิจารณาสถานการณ์ที่เราจำเป็นต้องแยกส่วนของสตริงตามตัวคั่น:

#รวม
#รวม

int หลัก ( ) {
std::สตริง fullString = 'แอปเปิ้ล-ส้ม-กล้วย' ;
size_t ตัวคั่น Pos = fullString.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 , ตัวคั่นPos ) ;

มาตรฐาน::cout << 'สตริงย่อยที่แยก: ' << สตริงย่อย << มาตรฐาน::endl;

กลับ 0 ;
}


ในตัวอย่างโค้ดนี้ เราเริ่มต้นด้วยการประกาศสตริงดั้งเดิม “fullString” ซึ่งเริ่มต้นด้วยค่า “apple-orange-banana” เป้าหมายของเราคือทำการแยกสตริงย่อย เพื่อให้บรรลุเป้าหมายนี้ เราใช้ฟังก์ชัน 'ค้นหา' ที่ได้รับจากไลบรารีมาตรฐาน C++

เมื่อเราระบุตำแหน่งของตัวคั่นภายใน “fullString” ซึ่งจัดเก็บไว้ในตัวแปร “delimiterPos” เราจะแยกสตริงย่อยที่ต้องการ ฟังก์ชัน “substr” ถูกเรียกใช้บนสตริงต้นฉบับ โดยระบุตำแหน่งเริ่มต้น (0) และความยาวของสตริงย่อยซึ่งเป็นตำแหน่งของตัวคั่นอย่างแม่นยำ การดำเนินการนี้ส่งผลให้เกิดการสร้าง 'std::string_view' ชื่อ 'subString' ซึ่งแสดงถึงส่วนของสตริงต้นฉบับตั้งแต่เริ่มต้นจนถึงตัวคั่น

ตัวอย่างที่ 5: โครงสร้างข้อมูลที่มีประสิทธิภาพหน่วยความจำ

“std::string_view” มีบทบาทสำคัญในการออกแบบโครงสร้างข้อมูลที่มีประสิทธิภาพหน่วยความจำ แทนที่จะจัดเก็บสำเนาสตริงหลายชุด โครงสร้างข้อมูลสามารถจัดเก็บอินสแตนซ์ “std::string_view” ได้ ซึ่งช่วยลดโอเวอร์เฮดของหน่วยความจำ

#รวม
#รวม

บันทึกโครงสร้าง {
มาตรฐาน::string_view ชื่อ;
อายุจริง;
} ;

int หลัก ( ) {

คนจดบันทึก = { “จอห์น โด” , 30 } ;

มาตรฐาน::cout << 'ชื่อ: ' << บุคคล.ชื่อ << ', อายุ: ' << คน อายุ << มาตรฐาน::endl;

กลับ 0 ;
}


ในตัวอย่างโค้ดนี้ เราแสดงการใช้งาน 'std::string_view' ภายในโครงสร้างข้อมูลที่มีประสิทธิภาพหน่วยความจำ เรากำหนดโครงสร้าง 'บันทึก' ที่ประกอบด้วยสมาชิก 'std::string_view' ชื่อ 'ชื่อ' และสมาชิกจำนวนเต็มเรียกว่า 'อายุ' การใช้ “std::string_view” ในบริบทนี้ช่วยให้เราสามารถสร้างการแสดงสตริงแบบน้ำหนักเบาได้โดยไม่จำเป็นต้องจัดสรรหน่วยความจำเพิ่มเติม

ในฟังก์ชัน 'main' เราจะสร้างอินสแตนซ์ของออบเจ็กต์ 'บันทึก' ชื่อ 'บุคคล' ด้วยชื่อ 'John Doe' และมีอายุ 30 ปี 'ชื่อ' สมาชิก 'std::string_view' ทำหน้าที่เป็นมุมมองที่ไม่ได้เป็นเจ้าของของ ข้อมูลอักขระที่สอดคล้องกับชื่อ ทำให้ไม่จำเป็นต้องทำซ้ำเนื้อหาสตริง “std::cout << “ชื่อ: ” << person.name << “, อายุ: ” << person.age << std::endl;” คำสั่งจะแสดงชื่อและอายุของบุคคลที่จัดเก็บไว้ในวัตถุ 'บันทึก'

บทสรุป

ในการพัฒนา C++ อย่างต่อเนื่อง “std::string_view” มีความโดดเด่นในฐานะส่วนเสริมอันทรงคุณค่าสำหรับชุดเครื่องมือของโปรแกรมเมอร์ อินสแตนซ์ที่อธิบายไว้ในบทความนี้เน้นถึงความสามารถในการปรับตัวและอรรถประโยชน์ของ 'std::string_view' ภายในขอบเขตของการเขียนโปรแกรม C++ ตั้งแต่การจัดการสตริงที่มีประสิทธิภาพและการทำงานร่วมกันอย่างราบรื่นกับโค้ดแบบเดิมไปจนถึงโครงสร้างข้อมูลที่มีประสิทธิภาพหน่วยความจำ “std::string_view” มีคุณค่าสำหรับนักพัฒนาที่กำลังมองหาการปรับปรุงประสิทธิภาพและโค้ดที่ได้รับการปรับปรุงในสถานการณ์ที่หลากหลาย สถานการณ์ในโลกแห่งความเป็นจริงเหล่านี้แสดงให้เห็นว่า 'std::string_view' สามารถเพิ่มประสิทธิภาพโค้ด ลดโอเวอร์เฮดของหน่วยความจำที่ไม่จำเป็น และส่งผลต่อประสิทธิภาพโดยรวมของแอปพลิเคชัน C++ ได้อย่างไร