하는 당신은 당신이 제한 적어도 경우, 동일한 컨테이너에 양측에서 빠른 삽입과 빠른 검색 모두를 가질 수 없습니다 : 여기
는 아이디어를 보여 코드 조각이다 STL에 대한 가능성. 더 많은 이국적인 비표준 컨테이너가 도움이 될 수 있습니다.
그러나 일반적으로 이러한 경우에 선택하는 방법은 두 개의 컨테이너를 사용하는 것입니다. 요소를 저장하기 위해 명백한 옵션은 std :: deque입니다.검색하려면 std::map<K,V>
을 만들고 V는 양면 큐의 반복자입니다. deques의 삽입/삭제가 관련되지 않은 반복자를 무효화하지 않기 때문에 항상 맵과 양면 큐를 동기화하는 것을 기억한다면 (예를 들어 양키 큐를 삽입하거나 삭제할 때 맵에서도 수행하십시오) . 반복자를 사용하는 대신에 더 간단하고 안전한 옵션 - 맵에서 검색 한 후에 발견 된 요소 만 있으면 (근처 요소 등을 방문 할 필요가 없음) - 양면 점과 맵 모두에 있어야합니다. 실제 객체 (특히 shared_ptr)에 대한 스마트 포인터. 다시 말하지만, 당신은 조심해야합니다 둘 다 동기화 유지; 동기화가 느슨한 경우 큰 재앙이되지는 않지만, 물론 프로그램의 일관성이 손상 될 것입니다.
struct MyItem
{
std::string name;
int something;
int another;
MyItem(const std::string &name_, int something_, int another_)
:name(name_), something(something_), another(another_) {}
};
class MyContainer
{
public:
typedef std::shared_ptr<MyItem> MyItemPtr;
void push_front(MyItemPtr item)
{
deque.push_front(item);
assert(map.find(item->name) == map.end());
map[item->name] = item;
}
void push_back(MyItemPtr item)
{
deque.push_back(item);
assert(map.find(item->name) == map.end());
map[item->name] = item;
}
MyItemPtr pop_front()
{
item = deque.front();
deque.pop_front();
map.erase(item->name);
return item;
}
MyItemPtr pop_back()
{
item = deque.back();
deque.pop_back();
map.erase(item->name);
return item;
}
MyItemPtr find(const std::string &name)
{
std::map<std::string, MyItemPtr>::iterator iter = map.find(name);
if (iter == map.end())
return MyItemPtr();
else
return iter->second;
}
private:
std::deque<MyItemPtr> deque;
std::map<std::string, MyItemPtr> map;
};
를 사용하려면 :
MyContainer container;
MyContainer::MyItemPtr a(new MyItem("blah", 1, 2));
container.push_back(a);
MyContainer::MyItemPtr b(new MyItem("foo", 5, 6));
container.push_front(b);
MyContainer::MyItemPtr f = container.find("blah");
if (f)
cout << f->name << ", " << f->something << ", " << f->another;
['std :: deque <>'] (http://en.cppreference.com/w/cpp/container/deque) ..? – ildjarn
그의 문제가 벡터 검색이 너무 느리다면, deque가 어떻게 도움이 될까요? – cgmb
그래, 검색 이상한 사람입니다. –