青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我輩豈是蓬蒿人!

C++ && keyWordSpotting

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  11 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks

常用鏈接

留言簿(9)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 7323
  • 排名 - 1369

最新評論

閱讀排行榜

評論排行榜

http://www.cprogramming.com/tutorial/stl/iterators.html

The concept of an iterator is fundamental to understanding the C++ Standard Template Library (STL) because iterators provide a means for accessing data stored in container classes such a vector, map, list, etc.

You can think of an iterator as pointing to an item that is part of a larger container of items. For intance, all containers support a function called begin, which will return an iterator pointing to the beginning of the container (the first element) and function, end, that returns an iterator corresponding to having reached the end of the container. In fact, you can access the element by "dereferencing" the iterator with a *, just as you would dereference a pointer.

To request an iterator appropriate for a particular STL templated class, you use the syntax

1?std::class_name<template_parameters>::iterator?name

where name is the name of the iterator variable you wish to create and the class_name is the name of the STL container you are using, and the template_paramters are the parameters to the template used to declare objects that will work with this iterator. Note that because the STL classes are part of the std namespace, you will need to either prefix every container class type with "std::", as in the example, or include "using namespace std;" at the top of your program.

For instance, if you had an STL vector storing integers, you could create an iterator for it as follows:
1std::vector<int>?myIntVector;
2std::vector<int>::iterator?myIntVectorIterator;
Different operations and containers support different types of iterator behavior. In fact, there are several different classes of iterators, each with slightly different properties. First, iterators are distinguished by whether you can use them for reading or writing data in the container. Some types of iterators allow for both reading and writing behavior, though not necessarily at the same time.

Some of the most important are the forward, backward and the bidirectional iterators. Both of these iterators can be used as either input or output iterators, meaning you can use them for either writing or reading. The forward iterator only allows movement one way -- from the front of the container to the back. To move from one element to the next, the increment operator, ++, can be used.

For instance, if you want to access the elements of an STL vector, it's best to use an iterator instead of the traditional C-style code. The strategy is fairly straightforward: call the container's begin function to get an iterator, use ++ to step through the objects in the container, access each object with the * operator ("*iterator") similar to the way you would access an object by dereferencing a pointer, and stop iterating when the iterator equals the container's end iterator. You can compare iterators using != to check for inequality, == to check for equality. (This only works for one twhen the iterators are operating on the same container!)

The old approach (avoid)
?1?using?namespace?std;
?2?
?3?vector<int>?myIntVector;
?4?
?5?//?Add?some?elements?to?myIntVector
?6?myIntVector.push_back(1);
?7?myIntVector.push_back(4);
?8?myIntVector.push_back(8);
?9?
10?for(int?y=0;?y<myIntVector.size();?y++)
11?{
12?????cout<<myIntVector[y]<<"?";??//Should?output?1?4?8
13?}
The STL approach (use this)
?1?using?namespace?std;
?2?
?3?vector<int>?myIntVector;
?4?vector<int>::iterator?myIntVectorIterator;
?5?
?6?//?Add?some?elements?to?myIntVector
?7?myIntVector.push_back(1);
?8?myIntVector.push_back(4);
?9?myIntVector.push_back(8);
10?
11?for(myIntVectorIterator?=?myIntVector.begin();?
12?????????myIntVectorIterator?!=?myIntVector.end();
13?????????myIntVectorIterator++)
14?{
15?????cout<<*myIntVectorIterator<<"?";????//Should?output?1?4?8
16?}
17?
As you might imagine, you can use the decrement operator, --, when working with a bidirectional iterator or a backward operator.

Iterators are often handy for specifying a particular range of things to operate on. For instance, the range item.begin(), item.end() is the entire container, but smaller slices can be used. This is particularly easy with one other, extremely general class of iterator, the random access iterator, which is functionally equivalent to a pointer in C or C++ in the sense that you can not only increment or decrement but also move an arbitrary distance in constant time (for instance, jump multiple elements down a vector).

For instance, the iterators associated with vectors are random access iterators so you could use arithmetic of the form
iterator + n
where n is an integer. The result will be the element corresponding to the nth item after the item pointed to be the current iterator. This can be a problem if you happen to exceed the bounds of your iterator by stepping forward (or backward) by too many elements.

The following code demonstrates both the use of random access iterators and exceeding the bounds of the array (don't run it!):
1?vector<int>?myIntVector;
2?vector<int>::iterator?myIntVectorIterator;
3?myIntVectorIterator?=?myIntVector.begin()?+?2;
You can also use the standard arithmetic shortcuts for addition and subtraction, += and -=, with random access iterators. Moreover, with random access iterators you can use <, >, <=, and >= to compare iterator positions within the container.

Iterators are also useful for some functions that belong to container classes that require operating on a range of values. A simple but useful example is the erase function. The vector template supports this function, which takes a range as specified by two iterators -- every element in the range is erased. For instance, to erase an entire vector:
1?vector<int>::iterator?myIntVectorIterator;
2?myIntVector.erase(myIntVectorIterator.begin(),?myIntVectorIterator.end());
which would delete all elements in the vector. If you only wanted to delete the first two elements, you could use
1myIntVector.erase(myIntVectorIterator.begin(),?myIntVectorIterator.begin()+2);
Note that various container class support different types of iterators -- the vector class, which has served as our model for iterators, supports a random access iterator, the most general kind. Another container, the list container (to be discussed later), only supports bidirectional iterators.

So why use iterators? First, they're a flexible way to access the data in containers that don't have obvious means of accessing all of the data (for instance, maps [to be discussed later]). They're also quite flexible -- if you change the underlying container, it's easy to change the associated iterator so long as you only use features associated with the iterator supported by both classes. Finally, the STL algorithms defined in <algorithm> (to be discussed later) use iterators.

Summary

The Good
  • The STL provides iterators as a convenient abstraction for accessing many different types of containers.
  • Iterators for templated classes are generated inside the class scope with the syntax
    class_name<parameters>::iterator
    
  • Iterators can be thought of as limited pointers (or, in the case of random access iterators, as nearly equivalent to pointers)
The Gotchas
  • Iterators do not provide bounds checking; it is possible to overstep the bounds of a container, resulting in segmentation faults
  • Different containers support different iterators, so it is not always possible to change the underlying container type without making changes to your code
  • Iterators can be invalidated if the underlying container (the container being iterated over) is changed significantly
posted on 2006-08-13 19:04 keyws 閱讀(556) 評論(0)  編輯 收藏 引用 所屬分類: STL

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产日韩精品一区二区三区| 亚洲一区图片| 性欧美大战久久久久久久免费观看| 亚洲激情视频在线观看| 最近中文字幕日韩精品| 91久久在线观看| 亚洲网友自拍| 久久av免费一区| 免费在线亚洲| 亚洲精品国产欧美| 亚洲精品一区二区三区在线观看| 亚洲日本成人| 亚洲欧美国产77777| 欧美中在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 欧美激情日韩| 国产视频综合在线| 亚洲精品在线免费观看视频| 亚洲一区二区伦理| 免费看av成人| 亚洲男人的天堂在线观看| 另类综合日韩欧美亚洲| 欧美午夜精品久久久久久浪潮| 一区二区三区自拍| 亚洲欧美成人综合| 亚洲美女av在线播放| 欧美专区在线观看一区| 亚洲国产清纯| 欧美一区二区三区免费大片| 欧美精品999| 国产在线精品自拍| 亚洲午夜一区二区| 欧美激情四色 | 欧美在线3区| 欧美日韩中文精品| 亚洲欧洲另类国产综合| 久久久久亚洲综合| 亚洲一区久久久| 欧美三日本三级少妇三2023| 亚洲黄色大片| 欧美刺激性大交免费视频| 欧美亚洲在线播放| 国产日韩一区二区三区| 亚洲综合欧美日韩| 亚洲免费大片| 欧美日韩ab片| 99精品国产在热久久婷婷| 欧美成年网站| 久久嫩草精品久久久精品一| 国产一区二区视频在线观看 | 久久精品亚洲一区二区三区浴池| 国产精品99免费看| 国产精品99久久久久久www| 亚洲激情网站| 欧美黑人一区二区三区| 91久久嫩草影院一区二区| 国产日韩欧美在线播放不卡| 亚洲欧美日韩精品一区二区 | 亚洲图片在线观看| 国产精品成人免费| 亚洲欧美经典视频| 亚洲专区在线视频| 国产午夜精品美女毛片视频| 久久久久国产一区二区三区| 亚洲欧美一区二区三区久久 | 极品少妇一区二区| 久久免费视频在线| 久久免费偷拍视频| 亚洲三级免费| 99视频在线精品国自产拍免费观看 | 久久婷婷国产综合精品青草| 亚洲资源av| 性做久久久久久免费观看欧美| 99精品视频免费观看| 国产精品免费看久久久香蕉| 久久av在线| 久久久久久久波多野高潮日日 | 欧美一区二区视频在线| 羞羞答答国产精品www一本 | 国产真实乱偷精品视频免| 久久人人97超碰国产公开结果| 快射av在线播放一区| 99人久久精品视频最新地址| 中文久久精品| 亚洲二区精品| 亚洲一区二区成人在线观看| 激情成人综合| 一本到12不卡视频在线dvd| 国产日韩成人精品| 亚洲高清资源综合久久精品| 欧美吻胸吃奶大尺度电影| 久久精品中文字幕一区二区三区| 免费不卡亚洲欧美| 欧美亚洲三级| 欧美久色视频| 久久中文字幕导航| 国产精品白丝jk黑袜喷水| 欧美大片va欧美在线播放| 国产精品v一区二区三区 | 欧美在线1区| 99在线精品视频| 久久精品一区蜜桃臀影院 | 久久久91精品| 国产精品wwwwww| 最新热久久免费视频| 韩国成人理伦片免费播放| 日韩一区二区久久| 在线欧美小视频| 香蕉精品999视频一区二区| 亚洲毛片在线观看| 久久av在线| 欧美怡红院视频| 欧美成人一区二区三区片免费| 久久久久九九九| 国产视频自拍一区| 亚洲一区精品电影| 亚洲一区日本| 欧美日韩国产成人在线| 亚洲国产mv| 亚洲清纯自拍| 欧美成人一区在线| 亚洲高清视频一区| 在线观看视频亚洲| 久久精品水蜜桃av综合天堂| 欧美在线高清| 国产精品美女999| 亚洲社区在线观看| 亚洲欧美韩国| 国产精品久久久久久久久免费桃花| 亚洲三级视频在线观看| 日韩午夜三级在线| 国产精品一区二区a| 久久精品一区二区三区不卡牛牛| 西瓜成人精品人成网站| 欧美视频中文在线看| 亚洲伦理中文字幕| 亚洲视频专区在线| 欧美小视频在线| 亚洲午夜在线观看| 欧美影院久久久| 国产最新精品精品你懂的| 欧美亚洲在线视频| 巨乳诱惑日韩免费av| 亚洲国产精品久久久久秋霞不卡 | 亚洲福利视频二区| 麻豆久久婷婷| 亚洲国产日韩综合一区| 一本一本久久| 国产精品一区二区三区乱码| 欧美一区二区视频在线观看| 久久这里有精品视频| 亚洲激情视频在线观看| 欧美日韩在线不卡一区| 亚洲欧美国产精品桃花| 久久久久久久999| 91久久夜色精品国产网站| 欧美日韩1234| 亚洲欧美成人在线| 蜜臀a∨国产成人精品 | 欧美91视频| av不卡在线| 国产日产精品一区二区三区四区的观看方式| 亚洲欧美一区二区激情| 欧美成人一区二区三区| 亚洲一区二区三区国产| 韩日成人av| 欧美日韩系列| 久久青草欧美一区二区三区| 日韩视频永久免费| 久久视频在线视频| 中日韩男男gay无套| 国内精品美女av在线播放| 欧美国产一区二区在线观看| 亚洲欧美综合v| 亚洲国产小视频| 久久精品免费| 中日韩美女免费视频网址在线观看| 国产精品视频久久一区| 久久综合一区| 亚洲欧美中文另类| 日韩视频精品| 欧美福利网址| 久久久久国产精品一区三寸| 一本色道久久88精品综合| 国产亚洲欧美在线| 国产精品久久久久久久久借妻| 久久手机免费观看| 欧美伊人久久大香线蕉综合69| 亚洲精品久久久久中文字幕欢迎你| 久久国产免费看| 亚洲综合色自拍一区| 亚洲美女精品成人在线视频| 国产主播一区| 国产美女一区二区| 欧美午夜在线视频| 欧美国产第一页| 久久综合九色综合欧美狠狠| 性xx色xx综合久久久xx| 亚洲字幕在线观看| 亚洲少妇最新在线视频|