나는 아직 C ++를 몰랐기 때문에 C ++로 프로젝트를하기로 결정했습니다. 가능한 한 모든 것을 C ++에서 수행하려고합니다. 즉, 원시 포인터가 거의 없음을 의미합니다.
개체 컬렉션을 구성하는 방법에 문제가 있습니다. 공정한 경고입니다.이 설명은 매우 추상화 될 것입니다.
Foo
Foo
클래스의 많은 객체를 보유 할 필요가 있습니다 Bar
. 빠른 삽입 및 삭제가 필요하고 주문이 필요하지 않아 세트를 사용하고 싶습니다.Bar
은 정확히 4 개의 유형의 객체를 소유 Baz
하며 초기화시 생성 및 수정됩니다.Baz
은 다른 많은 유형의 개체에 대한 포인터를 가지고 Baz
있습니다. 각 Baz
도에 대한 참조가 있어야 Bar
구현 이유로 그것을 소유.Baz
객체가 주어지면 의 세트 Bar
에서 해당 객체 를 제거하고 그에 Foo
따라 메모리를 해제해야합니다. (나는 제거시 Baz
소유에 대한 객체가 소유 한 Bar
다른 Baz
객체를 가리키는 알고리즘 적 보증 이 있습니다 Bar
)이를 구현하려는 방법은 Foo에 대한 고유 한 Bar 포인터 세트, 다 대다 Baz 관계를 처리하기위한 공유 포인터, Bar 개체 당 4 개의 Baz-> Bar 관계에 대한 일반 참조를 저장하는 것입니다. 문제는 내가 더 이상 줄을 얻을 수있는 방법이 없다는 것입니다 unique_ptr
으로부터 Baz
개체를. 참조가 있지만 세트 제거 방법은를 예상 unique_ptr
하므로 쉽게 제거 할 수 없습니다. 수동 포인터 / 메모리 관리에 의존 할 필요가없는이를 구조화하는 더 좋은 방법이 있습니까?
솔직히 말해서 모든 개체가 이미 컨테이너에 의해 관리되기 때문에 여기에서 스마트 포인터가 필요하지 않다고 생각합니다. 따라서 삭제가 보장됩니다.
그래서 그냥 원시 포인터를 사용하고 컨테이너가 작업을 수행하도록합니다.
struct Baz
{
struct Bar& bar;
std::vector<Baz*> bazs; // no need to be smart - deleted elsewhere
Baz(Bar& bar): bar(bar) {} // don't use bar in this constructor!
};
struct Bar
{
std::array<Baz, 4> bazs;
Bar(): bazs({*this, *this, *this, *this}) {}
};
struct Foo
{
std::vector<Bar> bars;
};
그들이 가리키는 개체가 스마트 포인터 또는 컨테이너에 의해 관리되는 한 원시 포인터를 사용하는 데 아무런 문제가 없습니다.
std::vector
이 예에서는 사용했지만 적절하다고 생각 되는 것을 사용 합니다. CPU 캐싱과 잘 작동하는 연속 메모리를 사용하기 때문에 std::vectors
경쟁 할 수 있다고 생각 std::set
합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다