📄 associativecontainer.html
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Author" CONTENT="Zafir Anjum">
<TITLE>MFC Programmer's SourceBook : STL Programmer's Guide</TITLE>
<META name="description"
content="A freely available implementation
of the C++ Standard Template Library, including
hypertext documentation.">
<META name="keywords"
content="generic programming, STL, standard template library">
</HEAD>
<SCRIPT LANGUAGE="JavaScript"><!--
var adcategory = "cpp";
// -->
</SCRIPT>
<body background="../../fancyhome/back.gif" bgcolor="#FFFFFF" >
<SCRIPT LANGUAGE="JavaScript"><!--
var nfrm = location.href.indexOf("_nfrm_");
var validframes = (top.frames.length > 0 && top.frames['ad'] && top.frames['logo'] );
var random = Math.random();
if( !validframes && nfrm == -1 )
{
var dclkPage = "www.codeguru.com/";
if( self.adcategory )
dclkPage += adcategory;
else
dclkPage += "mfc";
document.write('<nolayer><center>');
document.write('<iframe src="http://ad.doubleclick.net/adi/' + dclkPage + ';ord='
+ random + '" width=470 height=62 marginwidth=0 marginheight=0 hspace=0 vspace=0 '
+ 'frameborder=0 scrolling=no bordercolor="#000000">');
document.write('<a href="http://ad.doubleclick.net/jump/' + dclkPage + ';ord='
+ random + '">');
document.write('<img src="http://ad.doubleclick.net/ad/' + dclkPage + ';ord='
+ random + '" height=60 width=468>' + '</a>');
document.write('</iframe>');
document.write('</center></nolayer>');
document.write('<layer src="http://ad.doubleclick.net/adl/' + dclkPage +
';ord=' + random + '"></layer>');
document.write('<ilayer visibility=hide width=468 height=83></ilayer>');
}
// top.location = "/show.cgi?" + adcategory + "=" + location.pathname;
// -->
</SCRIPT>
<noscript>
<p align="center">
<a href="http://ad.doubleclick.net/jump/www.codeguru.com/cpp;ord=NupaF9FCY34AAHX54JI">
<img src="http://ad.doubleclick.net/ad/www.codeguru.com/cpp;ord=NupaF9FCY34AAHX54JI"></a>
</p>
</noscript>
<BR Clear>
<H1>Associative Container</H1>
<Table CellPadding=0 CellSpacing=0 width=100%>
<TR>
<TD Align=left><Img src = "containers.gif" Alt="" WIDTH = "194" HEIGHT = "38" ></TD>
<TD Align=right><Img src = "concept.gif" Alt="" WIDTH = "194" HEIGHT = "38" ></TD>
</TR>
<TR>
<TD Align=left VAlign=top><b>Category</b>: containers</TD>
<TD Align=right VAlign=top><b>Component type</b>: concept</TD>
</TR>
</Table>
<h3>Description</h3>
An Associative Container is a variable-sized <A href="Container.html">Container</A> that
supports efficient retrieval of elements (values) based on keys. It
supports insertion and removal of elements, but differs from a
<A href="Sequence.html">Sequence</A> in that it does not provide a mechanism for inserting an
element at a specific position. <A href="#1">[1]</A>
<P>
As with all containers, the elements in an Associative Container are
of type <tt>value_type</tt>. Additionally, each element in an Associative
Container has a <i>key</i>, of type <tt>key_type</tt>. In some Associative
Containers, <A href="SimpleAssociativeContainer.html">Simple Associative Containers</A>, the <tt>value_type</tt> and
<tt>key_type</tt> are the same: elements are their own keys. In others, the
key is some specific part of the value. Since elements are stored
according to their keys, it is essential that the key associated with
each element is immutable. In <A href="SimpleAssociativeContainer.html">Simple Associative Containers</A> this
means that the elements themselves are immutable, while
in other types of Associative Containers, such as
<A href="PairAssociativeContainer.html">Pair Associative Containers</A>, the elements themselves are mutable but
the part of an element that is its key cannot be modified. This means
that an Associative Container's value type is not <A href="Assignable.html">Assignable</A>.
<P>
The fact that the value type of an Associative Container is not
<A href="Assignable.html">Assignable</A> has an important consequence: associative
containers cannot have mutable iterators. This is simply because
a mutable iterator (as defined in the <A href="trivial.html">Trivial Iterator</A> requirements)
must allow assignment. That is, if <tt>i</tt> is a mutable iterator and
<tt>t</tt> is an object of <tt>i</tt>'s value type, then <tt>*i = t</tt> must be a valid
expression.
<P>
In <A href="SimpleAssociativeContainer.html">Simple Associative Containers</A>, where the elements are the keys,
the elements are completely immutable; the nested types <tt>iterator</tt> and
<tt>const_iterator</tt> are therefore the same. Other types of associative
containers, however, do have mutable elements, and do provide
iterators through which elements can be modified.
<A href="PairAssociativeContainer.html">Pair Associative Containers</A>, for example, have two different
nested types <tt>iterator</tt> and <tt>const_iterator</tt>. Even in this case,
<tt>iterator</tt> is not a mutable iterator: as explained above,
it does not provide the expression <tt>*i = t</tt>. It is, however, possible
to modify an element through such an iterator: if, for example, <tt>i</tt>
is of type <tt><A href="Map.html">map</A><int, double></tt>, then <tt>(*i).second = 3</tt> is a valid
expression.
<P>
In some associative containers, <A href="UniqueAssociativeContainer.html">Unique Associative Containers</A>,
it is guaranteed that no two elements have the same key. <A href="#2">[2]</A> In other
associative containers, <A href="MultipleAssociativeContainer.html">Multiple Associative Containers</A>, multiple
elements with the same key are permitted.
<h3>Refinement of</h3>
<A href="ForwardContainer.html">Forward Container</A>, <A href="DefaultConstructible.html" tppabs="http://www.sgi.com/Technology/STL/DefaultConstructible.shtml">Default Constructible</A>
<h3>Associated types</h3>
One new type is introduced, in addition to the types defined in the
<A href="ForwardContainer.html">Forward Container</A> requirements.
<Table border>
<TR>
<TD VAlign=top>
Key type
</TD>
<TD VAlign=top>
<tt>X::key_type</tt>
</TD>
<TD VAlign=top>
The type of the key associated with <tt>X::value_type</tt>. Note that the
key type and value type might be the same.
</TD>
</tr>
</table>
<h3>Notation</h3>
<Table>
<TR>
<TD VAlign=top>
<tt>X</tt>
</TD>
<TD VAlign=top>
A type that is a model of Associative Container
</TD>
</TR>
<TR>
<TD VAlign=top>
<tt>a</tt>
</TD>
<TD VAlign=top>
Object of type <tt>X</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
<tt>t</tt>
</TD>
<TD VAlign=top>
Object of type <tt>X::value_type</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
<tt>k</tt>
</TD>
<TD VAlign=top>
Object of type <tt>X::key_type</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
<tt>p</tt>, <tt>q</tt>
</TD>
<TD VAlign=top>
Object of type <tt>X::iterator</tt>
</TD>
</tr>
</table>
<h3>Definitions</h3>
If <tt>a</tt> is an associative container, then <tt>p</tt> is a
<i>valid iterator in a</i> if it is a valid iterator that is
reachable from <tt>a.begin()</tt>.
<P>
If <tt>a</tt> is an associative container, then <tt>[p, q)</tt> is a <i>valid range in a</i>
if <tt>[p, q)</tt> is a valid range and <tt>p</tt> is a valid iterator in <tt>a</tt>.
<h3>Valid expressions</h3>
In addition to the expressions defined in <A href="ForwardContainer.html">Forward Container</A>, the
following expressions must be valid.
<Table border>
<TR>
<TH>
Name
</TH>
<TH>
Expression
</TH>
<TH>
Type requirements
</TH>
<TH>
Return type
</TH>
</TR>
<TR>
<TD VAlign=top>
Default constructor
</TD>
<TD VAlign=top>
<pre>
X()
X a;
</pre>
</TD>
<TD VAlign=top>
</TD>
<TD VAlign=top>
</TD>
</TR>
<TR>
<TD VAlign=top>
Erase key
</TD>
<TD VAlign=top>
<tt>a.erase(k)</tt>
</TD>
<TD VAlign=top>
</TD>
<TD VAlign=top>
<tt>size_type</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
Erase element
</TD>
<TD VAlign=top>
<tt>a.erase(p)</tt>
</TD>
<TD VAlign=top>
</TD>
<TD VAlign=top>
<tt>void</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
Erase range
</TD>
<TD VAlign=top>
<tt>a.erase(p, q)</tt>
</TD>
<TD VAlign=top>
</TD>
<TD VAlign=top>
<tt>void</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
Clear
</TD>
<TD VAlign=top>
<tt>a.clear()</tt>
</TD>
<TD VAlign=top>
</TD>
<TD VAlign=top>
<tt>void</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
Find
</TD>
<TD VAlign=top>
<tt>a.find(k)</tt>
</TD>
<TD VAlign=top>
</TD>
<TD VAlign=top>
<tt>iterator</tt> if <tt>a</tt> is mutable, otherwise <tt>const_iterator</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
Count
</TD>
<TD VAlign=top>
<tt>a.count(k)</tt>
</TD>
<TD VAlign=top>
</TD>
<TD VAlign=top>
<tt>size_type</tt>
</TD>
</TR>
<TR>
<TD VAlign=top>
Equal range
</TD>
<TD VAlign=top>
<tt>a.equal_range(k)</tt>
</TD>
<TD VAlign=top>
</TD>
<TD VAlign=top>
<tt>pair<iterator, iterator></tt> if <tt>a</tt> is mutable, otherwise
<tt>pair<const_iterator, const_iterator></tt>.
</TD>
</tr>
</table>
<h3>Expression semantics</h3>
<Table border>
<TR>
<TH>
Name
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -