các hàm thành viên std :: length length () và size ()


264

Tôi đã đọc các câu trả lời cho điều này câu hỏi và thấy rằng có thực sự là một phương pháp gọi là length()cho std::string(Tôi luôn luôn sử dụng size()). Có bất kỳ lý do cụ thể để có phương pháp này trong std::stringlớp học? Tôi đọc cả MSDN và CppRefernce và dường như chúng chỉ ra rằng không có sự khác biệt giữa size()length(). Nếu đó là như vậy, không phải nó sẽ gây khó hiểu hơn cho người dùng của lớp sao?

Câu trả lời:


341

Theo tài liệu , đây chỉ là những từ đồng nghĩa. size()đang có để phù hợp với STL container khác (như vector, map, , vv ) và length()là để phù hợp với khái niệm trực quan nhất dân tộc của chuỗi kí tự. Mọi người thường nói về một từ, câu hoặc đoạn văn của thời gian , chứ không phải kích thước của nó, vì vậy length()ở đó để làm cho mọi việc dễ đọc hơn.


9
Đã đồng ý. Khi tôi viết các lớp mẫu và hàm tôi muốn sử dụng size()(Trong trường hợp tôi đã từng sử dụng các lớp không có chuỗi), nhưng hầu hết thời gian tôi sử dụng length()khi làm việc với các chuỗi đơn giản.
Marius

3
Không kích thước () trả về kích thước của chuỗi trong bộ nhớ (tính bằng byte), trong khi chiều dài () trả về số lượng ký tự, chỉ xảy ra trùng khớp, vì 1 char = 1 byte?
Boyan Kushlev

4
Không. Chúng là cùng một chức năng; họ thậm chí còn chia sẻ tài liệu: en.cppreference.com/w/cpp/opes/basic_opes/size .
Todd Gamblin

4
Cả hai đều được định nghĩa tương đương với khoảng cách (s.begin (), s.end ()), trong đó start () và end () là các trình lặp trên các phần tử CharT. CharT là một tham số mẫu xác định những gì trong chuỗi. Đối với std :: chuỗi, CharT là char. Đối với std :: w chuỗi, CharT là wchar_t, thường là 2 hoặc 4 byte. Ngay cả ở đó, cả length () và size () sẽ trả về số lượng ký tự trong chuỗi, KHÔNG phải số byte.
Todd Gamblin

5
Bạn phải quên đôi khi mọi người sẽ sử dụng chuỗi std :: để lưu trữ chuỗi UTF8 . và chuỗi utf8 là mã hóa độ dài thay đổi , sau đó bạn không thể sử dụng độ dài () hoặc kích thước () để lấy số lượng ký tự chuỗi. Trên thực tế, họ chỉ trả lại số phần tử:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian

16

Ruby giống nhau, btw, cung cấp cả hai #length #size dưới dạng từ đồng nghĩa cho số lượng mục trong mảng và giá trị băm (C ++ chỉ thực hiện cho chuỗi).

Những người theo chủ nghĩa tối giản và những người tin rằng "nên có một, và lý tưởng duy nhất là một cách rõ ràng để làm điều đó" (như Zen của Python đọc), tôi đoán, chủ yếu đồng ý với những nghi ngờ của bạn, @Naveen, trong khi những người hâm mộ Perl's " Có nhiều hơn một cách để làm điều đó "(hoặc cú pháp của SQL với một" từ tiếng ồn "tùy chọn có giá trị lớn để đưa ra các hình thức cú pháp tương đương giống hệt nhau để diễn đạt một khái niệm) sẽ không nghi ngờ gì khi Ruby và đặc biệt là C ++, không đi xa đủ để cung cấp dự phòng đồng nghĩa như vậy ;-).


9
Trong trường hợp này là vô cớ. Ngữ pháp và cách sử dụng của Perl cho phép bạn thể hiện mọi thứ bằng cách sử dụng bất kỳ phong cách nào bạn thích. Có hai từ khác nhau cho cùng một thứ chỉ khiến bạn khó tìm ra thuật ngữ tìm kiếm trong Stackoverflow.
Adrian Ratnapala

0

Khi sử dụng các công cụ thực hành mã hóa (LeetCode), dường như kích thước () nhanh hơn chiều dài () (mặc dù về cơ bản không đáng kể)


-10

độ dài của chuỗi == có bao nhiêu bit mà chuỗi có, kích thước == kích thước của các bit đó, Trong cả hai chuỗi đều giống nhau nếu trình soạn thảo phân bổ kích thước của ký tự là 1 byte


7
câu trả lời chưa chính xác. Xem tài liệu liên kết trong câu trả lời được chấp nhận.
Stefan de Kok
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.