효율은 코드에서 실제로 영향을받지 않습니다 (벡터 임의 액세스의 비용은 기본적으로 아무것도 아닙니다). 염려해야 할 것은 벡터 데이터 구조의 남용입니다.
복잡 할 정도로 클래스에 벡터를 사용해야하는 이유는 거의 없습니다. 제대로 정의 된 인터페이스를 가진 클래스가 코드를 더 효율적으로 만들지는 않지만 앞으로는 유지 관리를 훨씬 쉽게 할 것입니다.
현재 솔루션도 정의되지 않은 동작을 실행할 수 있습니다.예를 들어 사용자가 게시 된 코드를 가지고 :
Block b = rawSheets[pos.a].countries[pos.b].cities[pos.c].blocks[pos.d];
를 벡터 인덱스가 pos.a
에 의해 참조하면, pos.b
는, pos.c
는 pos.d
그 벡터 중 하나에 무엇을 존재하지 않는 일이 발생 지금은? 정의되지 않은 동작으로 들어가고 응용 프로그램이 아마도 segfault (운이 좋다면) 할 것입니다.
수정하려면 Block
개체를 검색하기 전에 ALL 벡터의 크기를 비교해야합니다.
Block b;
if ((pos.a < rawSheets.size()) &&
(pos.b < rawSheets[pos.a].countries.size()) &&
(pos.c < rawSheets[pos.a].countries[pos.b].cities.size()) &&
(pos.d < rawSheets[pos.a].countries[pos.b].cities[pos.c].blocks.size()))
{
b = rawSheets[pos.a].countries[pos.b].cities[pos.c].blocks[pos.d];
}
블록을 만들 때마다 실제로 그렇게 할 예정입니까?
class RawSheet
{
Block & FindBlock(const Pos &pos);
std::vector<Country> m_countries;
};
Block & RawSheet::FindBlock(const Pos &pos)
{
if ((pos.b < m_countries.size()) &&
(pos.c < m_countries[pos.b].cities.size()) &&
(pos.d < m_countries[pos.b].cities[pos.c].blocks.size()))
{
return m_countries[pos.b].cities[pos.c].blocks[pos.d];
}
else
{
throw <some exception type here>;
}
}
그런 다음이처럼 사용할 수 있습니다
당신
이
예 ... 것을 할 수있는, 또는 당신은, 적어도, 수업 시간에 그것을 마무리 할 수 있습니다 :
최소한
try
{
Block &b = rawSheets[pos.a].FindBlock(pos);
// Do stuff with b.
}
catch (const <some exception type here>& ex)
{
std::cout << "Unable to find block in sheet " << pos.a << std::endl;
}
, 당신은 RawSheet
클래스 내부에서 벡터를 계속 사용할 수 있지만,이 방법은 내부에있는, 당신은 일을 제거 할 수 있습니다 e 벡터 악용을 나중에 다른 곳에서 코드를 변경할 필요가 없습니다 (참조 : Law Of Demeter)!
성능에 대해서는 걱정할 필요가 있지만 걱정하지 않아야합니다. – delnan
구조체가 희소 할 경우 특히 pos와 위치 사이에보다 일반적인 매핑을 고려하는 것이 좋습니다. 예를 들어, 'unordered_map'이 여기서 유용 할 수 있습니다. –
@delnan 당신이 뭔가를 말할 때 그 이유를 말해야한다고 생각합니다. – user2381422