std :: ความยาวของสตริง () และขนาด () ฟังก์ชั่นสมาชิก


264

ผมอ่านคำตอบสำหรับเรื่องนี้คำถามและพบว่ามีจริงวิธีการที่เรียกว่าlength()สำหรับstd::string(ฉันมักจะใช้size()) มีเหตุผลเฉพาะสำหรับการมีวิธีนี้ในstd::stringชั้นเรียนหรือไม่? ผมอ่านทั้ง MSDN และ CppRefernce และพวกเขาชี้ให้เห็นว่ามีความแตกต่างระหว่างไม่มีและsize() length()หากเป็นเช่นนั้นจะไม่สร้างความสับสนให้กับผู้ใช้ของชั้นเรียนหรือไม่

คำตอบ:


341

ตามเอกสารเหล่านี้เป็นเพียงคำพ้องความหมาย size()เป็นที่จะต้องมีความสอดคล้องกับภาชนะ STL อื่น ๆ (เช่นvector, map, ฯลฯ ) และlength()เป็นเพื่อให้สอดคล้องกับความคิดที่ใช้งานง่ายของคนส่วนใหญ่ของสายอักขระ ผู้คนมักจะพูดถึงคำประโยคหรือความยาวของย่อหน้าไม่ใช่ขนาดของมันดังนั้นจึงlength()ทำให้อ่านง่ายขึ้น


9
ตกลง เมื่อฉันเขียนคลาสเทมเพลตและฟังก์ชั่นที่ฉันต้องการใช้size()(ในกรณีที่ฉันเคยใช้คลาสที่ไม่ใช่สตริง) แต่ส่วนใหญ่ฉันจะใช้length()เมื่อทำงานกับสตริงธรรมดา
Marius

3
size () ไม่ส่งคืนขนาดของสตริงในหน่วยความจำ (เป็นไบต์) ในขณะที่ length () ส่งคืนจำนวนอักขระที่เพิ่งจะเกิดขึ้นพร้อมกันตั้งแต่ 1 ถ่าน = 1 ไบต์?
Boyan Kushlev

4
ไม่พวกมันเป็นฟังก์ชั่นเดียวกัน พวกเขาเอกสารหุ้นแม้: en.cppreference.com/w/cpp/string/basic_string/size
ทอดด์ Gamblin

4
ทั้งคู่ถูกกำหนดให้เทียบเท่ากับระยะทาง (s.begin (), s.end ()) โดยที่ start () และ end () เป็นตัววนซ้ำในองค์ประกอบ CharT CharT เป็นพารามิเตอร์เทมเพลตที่กำหนดว่ามีอะไรอยู่ในสตริง สำหรับ std :: string, CharT คือ char สำหรับ std :: wstring CharT คือ wchar_t ซึ่งโดยทั่วไปคือ 2 หรือ 4 ไบต์ แม้ที่นั่นความยาว () และขนาด () จะคืนค่าจำนวนอักขระในสตริงไม่ใช่จำนวนไบต์
ทอดด์ Gamblin

5
คุณต้องลืมบางครั้งผู้คนจะใช้ std :: string เพื่อเก็บสตริงUTF8 และสตริง utf8 คือการเข้ารหัสความยาวผันแปรจากนั้นคุณไม่สามารถใช้ความยาว () หรือขนาด () เพื่อรับจำนวนอักขระสตริง ที่จริงแล้วพวกเขาเพียงแค่นับจำนวนองค์ประกอบ:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian

16

Ruby ของ btw เหมือนกันเพียงเสนอทั้งสอง#length และ #sizeเป็นคำพ้องความหมายสำหรับจำนวนของรายการในอาร์เรย์และแฮช (C ++ เพียงทำเพื่อสตริง)

มินิมัลลิสต์และผู้ที่เชื่อว่า "ควรมีอย่างใดอย่างหนึ่งและเป็นการดีเลิศเพียงวิธีเดียวเท่านั้นที่ชัดเจนที่จะทำ" (ในขณะที่ Zen of Python ท่อง) ฉันจะเดาว่าส่วนใหญ่เห็นด้วยกับข้อสงสัยของคุณ @Naveen ในขณะที่แฟน ๆ ของ Perl " มีมากกว่าหนึ่งวิธีในการทำ "(หรือไวยากรณ์ของ SQL ที่มีคำว่า" เสียงรบกวน "ซึ่งเป็นตัวเลือกมูลค่าหลายพันล้านบาทที่ให้รูปแบบวากยสัมพันธ์ที่เทียบเท่ากันเพื่อแสดงแนวคิดเดียว) ไม่ต้องสงสัยเลยว่า Ruby และโดยเฉพาะ C ++ เพียงพอในการเสนอความซ้ำซ้อนเช่นเดียวกัน ;-)


9
ในกรณีนี้มันฟรี ไวยากรณ์และการใช้ Perl ของช่วยให้คุณแสดงสิ่งที่ใช้สไตล์ที่คุณต้องการ การมีสองคำที่แตกต่างกันสำหรับสิ่งเดียวกันทำให้ยากที่จะเกิดขึ้นกับคำค้นหาใน Stackoverflow
Adrian Ratnapala

0

เมื่อใช้เครื่องมือฝึกการเขียนโค้ด (LeetCode) ดูเหมือนว่าขนาด () จะเร็วกว่าความยาว () (แม้ว่าจะเล็กน้อยมาก)


-10

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


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