//迭代器iterator 是访问string和vertor等更通用的一种方式,比下标访问更好
//有效的迭代器或者指向元素或者指向容器中的下一个位置
//有迭代器的类型(容器),同时拥有返回迭代器的成员begin/end
//begin返回迭代起的第一个元素,end返回迭代器成员的下一个元素的位置(是一个本身不存的元素)
//特殊情况如果迭代器为空,则begin和end返回的是同一个迭代器
//迭代器运算符 *iter,iter->mem(解引用指针并获取该元素名为men的成员) , ++iter, --iter,iter1!=iter2,iter1==iter2
//不能对end执行增操作和解引用操作,因为end伐木机哦的迭代器并不实际指向某个元素
//***泛型编程:这种编程风格在标准库提供的所有容器上都有效 例如:迭代器和!=
//迭代器类型iterator(能读写迭代器的元素)/const_iterator(只能读而不能写)
//迭代器的运算:iter+n, iter-n, iter1+=n, iter1-=n, iter1-iter2(两个迭代器的距离,类型为difference_type
//指的是iter2向前移动差值个元素后得到左侧的迭代器), >,>=,<,<=
//迭代器失效的情况:1)范围for循环中向vector对象添加元素。2)任何一种可能改变vector对象容器的操作,如push_back
//vector<string> v7{10,"hi"};指出其中元素的个数并将其输出
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void vec_Num(){
vector<string> v7 = { 10, "hi" };
cout << "The number of vector is " << v7.size() << endl;
for (int i = 0; i < v7.size(); i++)
{
cout << "The element of v7 is:";
cout <<* v7.begin() << endl;
}
//更简单的方法
//因为这里只是需要对迭代器进行读取,所以可以使用cbegin/cend(指的是静态迭代器,而begin和end指的是动态迭代器)
for (auto it = v7.begin(); it != v7.end(); it++)
cout << "The element of v7 is: " << *it << endl;
}
void upper_String(){
vector<string> v7;
string s;
string ss;
cout << "please input a sentence:" << endl;
cin >> s;
//*iter解引用后是pair<string,string>的指针类型,所以不能执行字符串的一些函数
for (auto it = s.begin(); it != s.end(); it++)
{
cout << *it;
}
string s1;
//这里使用getline有一个bug,当按下换行后会将第一个空格之前的字符串输出
//->这个可以读取指向对象中的成员
getline(cin, ss);
v7.push_back(ss);
for (auto itt = v7.begin(); itt != v7.end() && !itt->empty(); itt++)
{
for (auto it2 = itt->begin(); it2 != itt->end(); it2++)
*it2 = toupper(*it2);
cout << *itt << endl;
}
}
int main(){
vec_Num();
upper_String();
return 0;
}