Lấy phần tử cuối cùng của chuỗi std ::


87

Tôi đã tự hỏi liệu có một cách viết tắt hoặc một cách thanh lịch hơn để lấy ký tự cuối cùng của một chuỗi như trong:

char lastChar = myString.at( myString.length() - 1 );

Một cái gì đó myString.back()dường như không tồn tại. Có tương đương không?


Tôi nghĩ nó không cần thiết, vì bạn có thể làm điều đó khá dễ dàng với các chức năng được cung cấp.
Hoàng Long

4
Đối số đó cũng sẽ giữ cho các lớp vùng chứa.
Deve

Câu trả lời:


129

Trong C ++ 11 và hơn thế nữa, bạn có thể sử dụng backhàm thành viên:

char ch = myStr.back();

Trong C ++ 03, std::string::backkhông có sẵn do giám sát, nhưng bạn có thể khắc phục điều này bằng cách tham khảo những reverse_iteratorgì bạn nhận lại từ rbegin:

char ch = *myStr.rbegin();

Trong cả hai trường hợp, hãy cẩn thận để đảm bảo rằng chuỗi thực sự có ít nhất một ký tự trong đó! Nếu không, bạn sẽ nhận được hành vi không xác định , đó là Điều xấu.

Hi vọng điêu nay co ich!


13
một hàm back () đã được thêm vào trong C ++ 11
eddi Ngày

1
@ eddi- Cảm ơn bạn đã chỉ ra điều đó! Tôi đã cập nhật câu trả lời của mình cho phù hợp.
templatetypedef

Lưu ý: Tôi đã phải buộc g ++ để biên dịch với --std=c++11cho back()có sẵn.
JulianHarty

@JulianHarty Điều đó đúng với hầu hết các tính năng của C ++ 11, tôi tin vậy. :-)
templatetypedef

22

Bạn có thể muốn kiểm tra độ dài của chuỗi trước tiên và làm như sau:

if (!myStr.empty())
{
    char lastChar = *myStr.rbegin();
}

2
Bạn không cần phải kiểm tra độ dài. Nếu đó là chuỗi trống, bạn chỉ cần lấy '\ 0' được lưu trữ vào lastChar.
Mark Loeser

4
@MarkLoeser: Điều đó không đúng. *myStr.end()không giống như myStr[myStr.size()]! Và, ngay cả khi nó là, myStr.rbegin()tương đương với myStr.end()-1, rõ ràng là không hợp lệ trên một chuỗi trống.
Các cuộc đua ánh sáng trong quỹ đạo vào

7

Bạn có thể viết một mẫu hàm backủy quyền cho hàm thành viên cho các vùng chứa thông thường và một hàm bình thường triển khai chức năng còn thiếu cho các chuỗi:

template <typename C>
typename C::reference back(C& container)
{
    return container.back();
}

template <typename C>
typename C::const_reference back(const C& container)
{
    return container.back();
}

char& back(std::string& str)
{
    return *(str.end() - 1);
}

char back(const std::string& str)
{
    return *(str.end() - 1);
}

Sau đó, bạn có thể chỉ cần nói back(foo)mà không cần lo lắng đó foolà một chuỗi hay một vector.


2

*(myString.end() - 1)có lẽ? Đó cũng không phải là trang nhã.

Một con trăn myString.at(-1)sẽ yêu cầu quá nhiều về một lớp học vốn đã căng phồng.

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.