【C++指针(之迭代器)】iterator在容器与结构体数组的使用以及常型迭代器

/**
 * @file            
 * @author			jUicE_g2R(qq:3406291309)
 *						通信与信息专业大二在读	
 * @brief			C++迭代器iterator
 * @copyright		2023.10
 * @COPYRIGHT			 原创技术笔记:转载需获得博主本人同意,且需标明转载源
 * @language        C++
 */

1 迭代器 i t e r a t o r 迭代器iterator 迭代器iterator 容器 v e c t o r 容器vector 容器vector 中的使用

迭代器 i t e r a t o r 迭代器iterator 迭代器iterator 一般使用在 容器 v e c t o r 容器vector 容器vector 遍历 遍历 遍历,充当 遍历指针 遍历指针 遍历指针 的作用

int main(int* argc, char* argv[]) {
	
	vector<int> num{ 1,2,3 };
	vector<int>::iterator It;						//正向迭代器
	vector<int>::reverse_iterator rIt;				//反向迭代器
	for (It = num.begin(); It < num.end(); It++) {	//正向遍历整个容器
	//for (It = num.begin(); It != num.end(); It++)
		cout << *It;						//将指针解引用得到所指对象的值
	}
	for (rIt = a.rbegin(); rIt != a.rend(); rIt++) {//反向遍历整个容器
		cout << *rIt;
	}
	return 0;
}

2 迭代器 i t e r a t o r 迭代器iterator 迭代器iterator 结构体数组 s t r u c t 结构体数组struct 结构体数组struct 中的使用

typedef struct Student {
	int id;
	string name;
} stu, * pStu;
vector<stu> S;

int main(int* argc, char* argv[]) {
	stu tempS;
	tempS.id = 1;
	tempS.name = "jUicE";
	S.push_back(tempS);

	tempS.id = 2;
	tempS.name = "g2R";
	S.push_back(tempS);

	vector<stu>::iterator sIt = S.begin() + 1;//指向第二个元素
	cout << (*sIt).name << endl;
	cout << sIt->name << endl;
	return 0;
}

3 c o n s t const const i t e r a t o r iterator iterator

const iterator cIt;

3-1 性质

c I t cIt cIt 这个 迭代器(指针) 迭代器(指针) 迭代器(指针) 的 指向对象 的 值 不能通过 c I t cIt cIt 这个指针 来修改,而 c I t cIt cIt 的 指向对象 可以改变,与 const char* chchar const* ch 性质相同

3-2 适用场合

  • 容器 v e c t o r 容器vector 容器vector 中的元素值不允许被迭代器改写
  • 容器 v e c t o r 容器vector 容器vector c o n s t const const 限制 时,对应的迭代器也必须是 c o n s t const const i t e r a t o r iterator iterator

3-3 c b e g i n ( ) cbegin() cbegin() c e n d ( ) cend() cend()

for(auto cIt = num.cbegin(); cIt != num.cend(); cIt++)

c b e g i n ( ) cbegin() cbegin() c e n d ( ) cend() cend() 限制了 迭代器 迭代器 迭代器 的种类只能是 c o n s t 型 const型 const

4 i t e r a t o r iterator iterator f o r for for 语句中的缺陷

4-1 错误展示

i t e r a t o r iterator iterator f o r for for 语句中,决不允许在 f o r 语句 for语句 for语句 遍历期间,对 容器 v e c t o r 容器vector 容器vector 进行增删元素

for (It = num.begin(); It < num.end(); It++) {	//正向遍历整个容器
	num.emplace_back(4);				//num.push_back(4) 也行
	cout << *It;						//将指针解引用得到所指对象的值
}
for (val : num) {						//正向遍历整个容器
	num.emplace_back(4);				//num.push_back(4) 也行
	cout << val;						//将指针解引用得到所指对象的值
}

上面两种都会导致 程序崩溃 程序崩溃 程序崩溃!!!

4-2 解决办法

非要在 遍历期间 遍历期间 遍历期间 增删的话,也只能在增删后,立马 b r e a k break break 出来,然后重新遍历

for (It = num.begin(); It < num.end(); It++) {	//正向遍历整个容器
	if(...){
		num.emplace_back(4);				//num.push_back(4) 也行
		break;
	}
}
for (It = num.begin(); It < num.end(); It++) {	//正向遍历整个容器
	...
}

你可能感兴趣的:(c++,迭代器,容器,结构体,指针)