Tôi hiện đang làm việc trên một dự án C++ cần có ít phụ thuộc bên ngoài nhất có thể, và do đó tôi khá gắn bó với STL và Boost. Cho đến bây giờ, tôi hầu như chỉ sống trong Qt-land khi nói đến C++. Nói chung tôi có xu hướng sử dụng C# và Python khi tôi có thể.Có bao gồm thành ngữ STL để dễ đọc không?
Hôm nay tôi muốn kiểm tra xem một số std::vector
có chứa một mục nhất định hay không. Với Qt, tôi sẽ làm như sau:
QList<int> list;
list.append(1);
list.append(2);
list.append(3);
if (list.contains(2))
{
// do something
}
Tốt và dễ đọc. Nhưng std::vector
không có phương pháp contains
, điều này thật bất ngờ. Ok ... thành ngữ STL cho một thứ như thế là gì? Tìm kiếm xung quanh, có vẻ như sau:
std::vector<int> list;
list.push_back(1);
list.push_back(2);
list.push_back(3);
std::vector<int>::const_iterator result =
std::find(list.begin(), list.end(), 2);
if (result != list.end())
{
// do something
}
Điều đó (đối với tôi) khó đọc và quá dài dòng. Vì vậy, tôi thấy mình viết một chức năng tiện ích mà phải mất một vector và một giá trị và trả về bool
tùy thuộc vào việc giá trị đã được tìm thấy hay không. Về cơ bản, một phương pháp được tạo khuôn mẫu; trình bao bọc cho cuộc gọi ở trên std::find
. Sau đó tôi có thể sử dụng nó theo cách tương tự như ví dụ về Qt.
Tôi có một số chức năng tiện ích tương tự trong tâm trí mà sẽ quấn thành ngữ STL khác không có lý do khác nhưng một (nhận thức) tăng khả năng đọc. Điều tôi muốn biết là ... đây có phải là một ý tưởng tồi không? Những người khác cũng làm như vậy không? Tôi có thiếu cái gì đó quan trọng không? Mã sẽ là OSS tại một thời điểm, và tôi không muốn làm điều gì đó theo phong cách riêng mà các nhà phát triển C++ khác sẽ thấy lạ.
@rgrig Điều đó đối với tôi vẫn không thể đọc được như ví dụ Qt, và như bạn đã nói, nó không hiệu quả lắm. Nó phải là O (n/2), không phải O (n). – Lucas
Tôi không chắc chắn những gì bạn đang đề cập đến, vì nó dường như bị xóa, nhưng O (n/2) là O (n). Tuy nhiên, về chủ đề hiệu quả, một trình bao bọc như vậy có thể bị quá tải cho các bộ/bản đồ để tận dụng lợi thế của chúng được sắp xếp, mà không có bất kỳ thay đổi nào tại trang gọi. –