Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor

2023-03-03,,

Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor

<!--*/
.title { text-align: center; }
.todo { font-family: monospace; color: red; }
.done { color: green; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.right { margin-left: auto; margin-right: 0px; text-align: right; }
.left { margin-left: 0px; margin-right: auto; text-align: left; }
.center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
pre.src-sh:before { content: 'sh'; }
pre.src-bash:before { content: 'sh'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-R:before { content: 'R'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-java:before { content: 'Java'; }
pre.src-sql:before { content: 'SQL'; }

table { border-collapse:collapse; }
td, th { vertical-align:top; }
th.right { text-align: center; }
th.left { text-align: center; }
th.center { text-align: center; }
td.right { text-align: right; }
td.left { text-align: left; }
td.center { text-align: center; }
dt { font-weight: bold; }
.footpara:nth-child(2) { display: inline; }
.footpara { display: block; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
/*]]>-->*/-->

div.org-src-container {
font-size: 85%;
font-family: monospace;
}

Table of Contents

1. Iterator 的类型
2. 迭代器之间的转换
3. Iterator is Special
4. 总结:

1 Iterator 的类型

标准容器提供了四种迭代器,以 conainer<T> 为例:

itertor:
形如 T* ,正向增长。
const_itertor:
形如 const T * ,指向内容只读,正向增长。
reverse_itertor:
形如 T* ,反向增长。
const_reverse_itertor:
形如 const T * ,指向内容只读,反向增长。

2 迭代器之间的转换

他们之间的转换关系如下图所示:

Figure 1: Conversion between iterators

./images/iterator_conversion.dot

其中值得注意的是, reverse_iterator 可以通过 base() 来转换到 iterator ,但这个转换可能并不是我们真正需要的那个。而除此之外,剩余的两种迭代器都无法转换成 iterator

3 Iterator is Special

瞅一眼 vector<T> 的几个方法:

iterator insert(iterator p, const T& x);
iterator erase(iterator p);
iterator erase(iterator rangebegin, iterator rangeEnd);

这里用到的都是 iterator

4 总结:

Prefer Iterator, 原因:

若干函数(插入,删除等)需要的都是 iterator
const_iterator 不能隐式地转换成 iterator
reverse_iteratoriterator 的转换可能需要迭代器的调整。

(转载请注明出处,使用许可:署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 。)

Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor的相关教程结束。

《Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor.doc》

下载本文的Word格式文档,以方便收藏与打印。