025迭代器常见操作
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;
struct Student
{
int age;
int number;
} ;
int main ( void )
{
vector< int > Number1 = { 100 , 200 , 300 , 400 } ;
vector< int > :: iterator iter;
iter = Number1. begin ( ) ;
iter = Number1. end ( ) ;
vector< int > Number2;
vector< int > :: iterator beginIter = Number2. begin ( ) ;
vector< int > :: iterator endIter = Number2. end ( ) ;
if ( beginIter== endIter)
{
cout << "两个迭代器指向同一个位置" << endl;
}
for ( vector< int > :: iterator iter2= Number1. begin ( ) ; iter2!= Number1. end ( ) ; iter2++ )
{
cout << * iter2 << endl;
}
for ( vector< int > :: reverse_iterator rIter3= Number1. rbegin ( ) ; rIter3!= Number1. rend ( ) ; rIter3++ )
{
cout << * rIter3 << endl;
}
vector< Student> stuVector;
Student myStu = { 12 , 1000 } ;
stuVector. push_back ( myStu) ;
vector< Student> :: iterator iter04 = stuVector. begin ( ) ;
cout << ( * iter04) . number << endl;
cout << iter04- > number << endl;
const vector< int > Number04 = { 0 , 1 , 2 , 3 , 4 } ;
for ( vector< int > :: const_iterator cIter = Number04. begin ( ) ; cIter!= Number04. end ( ) ; cIter++ )
{
cout << * cIter << endl;
}
for ( auto iter05= Number04. cbegin ( ) ; iter05!= Number04. end ( ) ; iter05++ )
{
cout << * iter05 << endl;
}
vector< int > Number06 = { 1 , 2 , 3 , 4 , 5 } ;
for ( auto x: Number06)
{
cout << x << endl;
}
for ( auto beg= Number06. begin ( ) , end1= Number06. end ( ) ; beg!= end1; beg++ )
{
cout << * beg << endl;
}
system ( "pause" ) ;
return 0 ;
}
/ *
* ( 1 ) 迭代器简介
* vector是一个容器,迭代器就是一种遍历容器内元素的数据类型。这种数据类型像指针。
* 我们理解迭代器就指向容器中的某个元素。
*
* 如vector和string中可以通过下标运算符[ ] 来访问元素,其实在c++ 中很少通过下标来访问,一般通过迭代器来访问。
* 通过迭代器,我们可以读容器中的元素值,读string中的每个字符,还可以修改某个迭代器所指向的元素值。迭代器也有++ -- 等操作
* 尽量使用迭代器来访问迭代器中的元素。
*
* (2 )容器的迭代器类型
* 每一种容器中都会定义一个iterator的成员,是固定的
*
* 迭代器begin ( ) end ( ) rbegin ( ) rend ( ) 操作
* begin ( ) end ( ) 用于返回迭代类型,
* 1. begin ( ) 返回一个迭代器类型,理解为返回一个迭代器
* 2. end ( ) 并不指向容器中的任何元素,起的作用实际上是标记作用。
* 3. 遍历输出容器中的内容for
*
* (3 )迭代器运算符
* * iter-- 返回迭代器iter所指向的元素的引用。必须要保证迭代器指向的是有效的元素。不能指向end ( )
* ++ iter iter++ 迭代器指向下一个元素。指向end ( ) 不能再++
* -- iter iter-- 指向容器中的上一个元素
* iter1== iter2 != 判断两个迭代器是否相等== =
*
* (4 )const_iterator迭代器-- 一般表示常量迭代器,表示不能通过迭代器去修改容器中元素的值。迭代器本身的指向是可以改变的。
* 感觉起来有点像常量指针。
* (5 ) cbegin ( ) cend ( ) 函数 返回的都是常量迭代器,与是否是常量容器无关
*
*
*
* /
026迭代器失效灾难程序演示
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;
int main ( void )
{
vector< int > Number1{ 1 , 2 , 3 , 4 , 5 } ;
auto beg = Number1. begin ( ) ;
auto end = Number1. end ( ) ;
while ( beg!= end)
{
cout << * beg << endl;
Number1. insert ( beg, 1000 ) ;
break ;
++ beg;
}
beg = Number1. begin ( ) ;
end = Number1. end ( ) ;
while ( beg != end)
{
cout << * beg << endl;
++ beg;
}
auto beg2 = Number1. begin ( ) ;
int iCount = 0 ;
while ( beg2!= Number1. end ( ) )
{
beg2 = Number1. insert ( beg2, iCount + 80 ) ;
iCount++ ;
if ( iCount> 10 )
{
break ;
}
++ beg2;
}
for ( beg2= Number1. begin ( ) ; beg2!= Number1. end ( ) ; beg2++ )
{
cout << * beg2 << endl;
}
system ( "pause" ) ;
return 0 ;
}
灾难程序演示2
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;
int main ( void )
{
vector< int > Number1{ 1 , 2 , 3 , 4 , 5 } ;
auto beg = Number1. begin ( ) ;
auto end = Number1. end ( ) ;
for ( ; beg!= end; beg++ )
{
}
vector< int > :: iterator iter = Number1. begin ( ) ;
while ( iter!= Number1. end ( ) )
{
iter = Number1. erase ( iter) ;
}
while ( ! Number1. empty ( ) )
{
auto iter2 = Number1. begin ( ) ;
Number1. erase ( iter2) ;
}
system ( "pause" ) ;
return 0 ;
}
028用迭代器遍历string类型数据
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
int main ( void )
{
string str ( "jisuanjizuochegnyuanli" ) ;
for ( auto iter= str. begin ( ) ; iter!= str. end ( ) ; iter++ )
{
* iter = std:: toupper ( ( * iter) ) ;
}
cout << str << endl;
system ( "pause" ) ;
return 0 ;
}
029vector容器常用操作与内存释放
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
struct Config
{
char IterName[ 128 ] ;
char ItemContent[ 128 ] ;
} ;
using namespace std;
char * getInfo ( vector< Config* > & conflist, char * pItem)
{
for ( auto pos= conflist. begin ( ) ; pos!= conflist. end ( ) ; pos++ )
{
if ( strcmp ( ( * pos) - > IterName, pItem) == 0 )
{
return ( * pos) - > ItemContent;
}
}
return nullptr ;
}
int main ( void )
{
Config* pConfig = new Config;
strcpy_s ( pConfig- > IterName, sizeof ( pConfig- > IterName) , "ServerName" ) ;
strcpy_s ( pConfig- > ItemContent, sizeof ( pConfig- > ItemContent) , "1区" ) ;
Config* pConfig2 = new Config;
strcpy_s ( pConfig2- > IterName, sizeof ( pConfig2- > IterName) , "ServerID" ) ;
strcpy_s ( pConfig2- > ItemContent, sizeof ( pConfig2- > ItemContent) , "100000" ) ;
vector< Config* > ConfList;
ConfList. push_back ( pConfig) ;
ConfList. push_back ( pConfig2) ;
char * p_Tem = getInfo ( ConfList, "ServerName" ) ;
if ( p_Tem!= nullptr )
{
cout << p_Tem << endl;
}
for ( vector< Config* > :: iterator pos= ConfList. begin ( ) ; pos!= ConfList. end ( ) ; pos++ )
{
delete ( * pos) ;
}
ConfList. clear ( ) ;
system ( "pause" ) ;
return 0 ;
}