저는 현재 가능한 한 많은 외부 의존성을 가져야하는 C++ 프로젝트에서 작업하고 있습니다. 따라서 STL과 부스트에 상당히 집착하고 있습니다. 지금까지 C++에 관해서는 거의 독점적으로 Qt-land에 살고있었습니다. 일반적으로 저는 C#과 Python을 사용할 수 있습니다.가독성을위한 STL 숙어를 감싸는 것이 좋습니다.
오늘 std::vector
에 특정 항목이 있는지 확인하고 싶습니다. Qt를 사용하면 이렇게 할 수 있습니다.
QList<int> list;
list.append(1);
list.append(2);
list.append(3);
if (list.contains(2))
{
// do something
}
멋지고 읽기 쉽습니다. 그러나 std::vector
에는 contains
메서드가 없으므로 놀랍습니다. 좋아요. STL 관용구는 그런 무엇인가? 주위를 검색하면 다음과 같이 보입니다.
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
}
저에게 (나에게는) 거의 읽을 수없고 너무 자세한 내용입니다. 그래서 나는 벡터와 값을 취하는 유틸리티 함수를 작성하고 그 값을 찾았는지 아닌지에 따라 bool
을 반환한다는 것을 알게되었습니다. 기본적으로, 템플릿 화 된 메소드; 위의 std::find
호출에 대한 래퍼. 그런 다음 Qt 예제와 비슷한 방식으로 사용할 수 있습니다.
필자는 다른 이유로 인해 다른 STL 관용구를 감싸는 것이 아니라 가독성을 높이기 위해 몇 가지 유사한 유틸리티 기능을 염두에두고 있습니다. 내가 알고 싶은 건 ...이게 나쁜 생각이야? 다른 사람들도 똑같은 행동을합니까? 내가 뭔가 중요한 것을 놓친 건가? 이 코드는 한 시점에서 OSS가 될 것이며 다른 C++ 개발자가 이상하게 보일 수있는 이상한 것을하지는 않을 것입니다.
@rgrig 제게는 여전히 Qt 예제처럼 읽기 쉽지 않습니다. 당신이 말했듯이 그렇게 효율적이지는 않습니다. O (n/2)가 아니고 O (n)이어야합니다. – Lucas
O (n/2)가 O (n) 인 경우 분명히 삭제되었으므로 귀하가 추천하는 내용을 잘 모릅니다. 효율성 측면에서 볼 때, 그러한 래퍼는 콜 사이트에서 변경없이 세트/맵이 정렬되는 것을 이용하기 위해 오버로드 될 수 있습니다. –