나는 std::map<int, std::vector<SomeStruct>>
,
을 가지고 있으며 std::vector<SomeStruct> FindData(int key)
과 같은 쿼리를 제공합니다.내 함수가 std :: vector에 대한 포인터 또는 std :: vector에 대한 참조를 반환해야합니까?
데이터 전체를 복사하지 않으려면 std::vector<SomeStruct>& FindData(int key)
으로 수정하십시오.
그러나 특정 데이터는 없습니다 key
, 그래서 때로는 아무것도 반환 할 수 있습니다.
그런 경우, 파일 범위 변수를 선언하고 빈 std::vector<SomeStruct>
을 반환합니다.
그러나 벡터에 대한 포인터를 선택하면 std::vector<SomeStruct>* FindData(int key)
이되며 key
에 대해 NULL
을 반환 할 수 있습니다.
어느 것이 더 낫습니까?
은 내가 operator[]
쉽게 사용할 수 있도록 std::vector
에 그 포인터, 질문 (Is there other syntax for this pointer operation?)
그리고 개인적으로 너무 std::vector
을 참조 같은 나쁜 (또는 이상한?하지 않도록)입니다 배웠습니다,하지만 단점은 내가 선언 할 필요가있다 그것에 대한 추가 빈 변수.
코드 예제 등이있다 : SomeClass.h
typedef std::vector<SomeStruct> DataVec;
typedef std::map<int, DataVec> DataMap;
DataMap m_DataMap;
지금 SomeClass.cpp
에서 :
사례 1 :
namespace
{
DataVec EmptyVector;
}
DataVec& FindDatas(int key)
{
DataMap::iterator It = m_DataMap.find(key);
if (It == m_DataMap.end()) return EmptyVec;
return It->second;
}
사례 2 :
DataVec* FindDatas(int key)
{
DataMap::iterator It = m_DataMap.find(key);
if (It == m_DataMap.end()) return NULL;
return &(It->second);
}
참조 ence :
장점 : 보통 std::vector
처럼 보입니다.
단점 : 추가 변수가 선언되었습니다.
포인터 :
장점 : 쿼리 함수가 짧고 다른 변수가 필요하지 않습니다.
단점 : 이상하게 보입니다 (?!), p[i]
을 사용하면 +1 할 수 있습니다. (*p)[i]
, 귀찮습니다.
어느 것이 더 낫습니까?
참조를 반환합니다. 디폴트의 생성 된 벡터는 가벼운 객체이므로 주위에 추가로'EmptyVector'를두면 걱정할 필요가 없습니다. 'nullptr'을 리턴하면 모든 클라이언트 코드는 그 체크를 포함해야합니다. 나는 빈 vector를 검사하는 것보다 개인적으로 더 짜증이납니다. – Praetorian
@Praetorian : 나는 비슷한 생각을 가지고 있습니다. 그래서 나는 참조를 선호합니다. 하지만 클라이언트는'if (p.empty()) return '을 검사해야하기 때문에 null 체크 문이 여전히 존재할 수도 있습니다 : ( –