… | |
… | |
405 | return !strcmp (a, b); |
405 | return !strcmp (a, b); |
406 | } |
406 | } |
407 | }; |
407 | }; |
408 | |
408 | |
409 | // Mostly the same as std::vector, but insert/erase can reorder |
409 | // Mostly the same as std::vector, but insert/erase can reorder |
410 | // the elements, making insret/remove O(1) instead of O(n). |
410 | // the elements, making append(=insert)/remove O(1) instead of O(n). |
411 | // |
411 | // |
412 | // NOTE: only some forms of erase/insert are available |
412 | // NOTE: only some forms of erase are available |
413 | template<class T> |
413 | template<class T> |
414 | struct unordered_vector : std::vector<T, slice_allocator<T> > |
414 | struct unordered_vector : std::vector<T, slice_allocator<T> > |
415 | { |
415 | { |
416 | typedef typename unordered_vector::iterator iterator; |
416 | typedef typename unordered_vector::iterator iterator; |
417 | |
417 | |
… | |
… | |
458 | return obj->*indexmember |
458 | return obj->*indexmember |
459 | ? this->begin () + obj->*indexmember - 1 |
459 | ? this->begin () + obj->*indexmember - 1 |
460 | : this->end (); |
460 | : this->end (); |
461 | } |
461 | } |
462 | |
462 | |
|
|
463 | void push_back (T *obj) |
|
|
464 | { |
|
|
465 | std::vector<T *, slice_allocator<T *> >::push_back (obj); |
|
|
466 | obj->*indexmember = this->size (); |
|
|
467 | } |
|
|
468 | |
463 | void insert (T *obj) |
469 | void insert (T *obj) |
464 | { |
470 | { |
465 | push_back (obj); |
471 | push_back (obj); |
466 | obj->*indexmember = this->size (); |
|
|
467 | } |
472 | } |
468 | |
473 | |
469 | void insert (T &obj) |
474 | void insert (T &obj) |
470 | { |
475 | { |
471 | insert (&obj); |
476 | insert (&obj); |