Set the DB_RENUMBER flag in the database
handle if you want
db_vector<>
to
work like std::vector
or
std::deque
. Do not set
DB_RENUMBER if you want
db_vector<>
to
work like std::list
. Note
that without DB_RENUMBER set,
db_vector<>
can
work faster.
For example, to construct a fast
std::queue/std::stack object, you only need a
db_vector<>
object whose database handle does not have
DB_RENUMBER set. Of course, if the database
handle has DB_RENUMBER set, it still works for
this kind of scenario, just not as fast.
db_vector
does not check
whether DB_RENUMBER is set. If you do not set
it, db_vector<>
will
not work like
std::vector<>/std::deque<> with regard
to operator[], because the indices are not
maintained in that case.
You can find example code showing how to use
this feature in the
StlAdvancedFeaturesExample::queue_stack()
method.
Just as is the case with
std::vector
,
inserting/deleting in the middle of a
db_vector
is slower
than doing the same action at the end of the
sequence. This is because the underlying DB_RECNO
DB (with the DB_RENUMBER flag set) is relatively
slow when inserting/deleting in the middle or the
head — it has to update the index numbers of
all the records following the one that was
inserted/deleted. If you do not need to keep the
index ordered on insert/delete, you can use
db_map
instead.
db_vector
also contains
methods inherited from
std::list
and
std::deque
, including
std::list<>'s
unique methods remove()
,
remove_if()
,
unique()
,
merge()
,
sort()
,
reverse()
, and
splice()
. These use
the identical semantics/behaviors of the
std::list<>
methods, although pushing/deleting at the head is
slower than the
std::deque
and
std::list
equivalent
when there are quite a lot of elements in the
database.
You can use std::queue
,
std::priority_queue
and
std::stack
container
adapters with db_vector
;
they work with db_vector even without
DB_RENUMBER set.
db_map
contains the union of method
set from std::map
and
hash_map
, but there are some
methods that can only be called on containers backed by
DB_BTREE
or
DB_HASH
databases. You can call
db_map<>::is_hash()
to
figure out the type of the backing database. If you call
unsupported methods then an InvalidFunctionCall exception
is thrown.
These are the DB_BTREE
specific
methods: upper_bound()
,
lower_bound()
,
key_comp()
, and
value_comp()
. The
DB_HASH
specific methods are
key_eq()
,
hash_funct()
.