1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Dbstl container specific notes</title>
<link rel="stylesheet" href="gettingStarted.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
<link rel="start" href="index.html" title="Berkeley DB Programmer's Reference Guide" />
<link rel="up" href="stl.html" title="Chapter 7. Standard Template Library API" />
<link rel="prev" href="stl_persistence.html" title="Dbstl persistence" />
<link rel="next" href="stl_efficienct_use.html" title="Using dbstl efficiently" />
</head>
<body>
<div xmlns="" class="navheader">
<div class="libver">
<p>Library Version 11.2.5.3</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Dbstl container specific notes</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="stl_persistence.html">Prev</a> </td>
<th width="60%" align="center">Chapter 7. Standard Template Library API</th>
<td width="20%" align="right"> <a accesskey="n" href="stl_efficienct_use.html">Next</a></td>
</tr>
</table>
<hr />
</div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a id="stl_container_specific"></a>Dbstl container specific notes</h2>
</div>
</div>
</div>
<div class="toc">
<dl>
<dt>
<span class="sect2">
<a href="stl_container_specific.html#idp51492808">db_vector specific notes</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="stl_container_specific.html#idp51561456">Associative container specific notes</a>
</span>
</dt>
</dl>
</div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="idp51492808"></a>db_vector specific notes</h3>
</div>
</div>
</div>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>
Set the <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_RENUMBER" class="olink">DB_RENUMBER</a> flag in the database handle if you want
<code class="classname">db_vector<></code> to work like
<code class="classname">std::vector</code> or <code class="classname">std::deque</code>. Do not set
<a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_RENUMBER" class="olink">DB_RENUMBER</a> if you want <code class="classname">db_vector<></code> to work like
<code class="classname">std::list</code>. Note that without <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_RENUMBER" class="olink">DB_RENUMBER</a> set,
<code class="classname">db_vector<></code> can work faster.
</p>
<p>
For example, to construct a fast std::queue/std::stack object, you only need a
<code class="classname">db_vector<></code> object whose database handle does not have
<a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_RENUMBER" class="olink">DB_RENUMBER</a> set. Of course, if the database handle has <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_RENUMBER" class="olink">DB_RENUMBER</a> set, it
still works for this kind of scenario, just not as fast.
</p>
<p>
<code class="classname">db_vector</code> does not check whether <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_RENUMBER" class="olink">DB_RENUMBER</a> is set. If
you do not set it, <code class="classname">db_vector<></code> will not work like
std::vector<>/std::deque<> with regard to operator[], because the
indices are not maintained in that case.
</p>
<p>
You can find example code showing how to use this feature in the
<code class="methodname">StlAdvancedFeaturesExample::queue_stack()</code> method.
</p>
</li>
<li>
<p>
Just as is the case with <code class="classname">std::vector</code>, inserting/deleting in
the middle of a <code class="classname">db_vector</code> is slower than doing the same
action at the end of the sequence. This is because the underlying DB_RECNO DB (with
the <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_RENUMBER" class="olink">DB_RENUMBER</a> 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 <code class="classname">db_map</code> instead.
</p>
<p>
<code class="classname">db_vector</code> also contains methods inherited from
<code class="classname">std::list</code> and <code class="classname">std::deque</code>,
including <code class="classname">std::list<>'s</code> unique methods
<code class="methodname">remove()</code>, <code class="methodname">remove_if()</code>,
<code class="methodname">unique()</code>, <code class="methodname">merge()</code>,
<code class="methodname">sort()</code>, <code class="methodname">reverse()</code>, and
<code class="methodname">splice()</code>. These use the identical semantics/behaviors
of the <code class="classname">std::list<></code> methods, although
pushing/deleting at the head is slower than the
<code class="methodname">std::deque</code> and <code class="methodname">std::list</code>
equivalent when there are quite a lot of elements in the database.
</p>
</li>
<li>
<p>
You can use <code class="classname">std::queue</code>,
<code class="classname">std::priority_queue</code> and <code class="classname">std::stack</code>
container adapters with <code class="classname">db_vector</code>; they work with db_vector
even without <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_RENUMBER" class="olink">DB_RENUMBER</a> set.
</p>
</li>
</ul>
</div>
</div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="idp51561456"></a>Associative container specific notes</h3>
</div>
</div>
</div>
<p>
<code class="classname">db_map</code> contains the union of method set from
<code class="classname">std::map</code> and <code class="classname">hash_map</code>, but there are some
methods that can only be called on containers backed by <code class="literal">DB_BTREE</code> or
<code class="literal">DB_HASH</code> databases. You can call
<code class="function">db_map<>::is_hash()</code> to figure out the type of the backing
database. If you call unsupported methods then an InvalidFunctionCall exception is thrown.
</p>
<p>
These are the <code class="literal">DB_BTREE</code> specific methods: <code class="methodname">upper_bound()</code>,
<code class="methodname">lower_bound()</code>, <code class="methodname">key_comp()</code>,
and <code class="methodname">value_comp()</code>. The <code class="literal">DB_HASH</code> specific methods are
<code class="methodname">key_eq()</code>, <code class="methodname">hash_funct()</code>.
</p>
</div>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="stl_persistence.html">Prev</a> </td>
<td width="20%" align="center">
<a accesskey="u" href="stl.html">Up</a>
</td>
<td width="40%" align="right"> <a accesskey="n" href="stl_efficienct_use.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Dbstl persistence </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> Using dbstl efficiently</td>
</tr>
</table>
</div>
</body>
</html>
|