境内极经典的7漫漫骑行路—毕业了语言,我们失去骑行吧!

注意事项:环湖路程中以发生有道与109国道交汇。109国道是平等长条很繁忙的交通运输路,常年行驶有恢宏的特大型卡车,在是路段骑行时,需要特别注意安全。

vector的元素删除

vector的去,是冲职务展开删除,如若想使去除某个元素,需要找到时元素的迭代器地点,再举行删除。

erase(iterator)函数,删除后相会回到时迭代器的下一个职位。

int main(int argc, const char * argv[]) {

    //1 创建容器并初始化
    vector<int> v1(10);
    for (int i = 0; i < v1.size(); i++) {
        v1[i] = i;
    }

    //2 区间删除
    //--2.1 删除前3个元素
    v1.erase(v1.begin(), v1.begin() + 3);

    //--2.2 删除指定位置的元素
    v1.erase(v1.begin() +3);

    //3 根据元素的值进行删除,删除值为2的元素
    v1.push_back(2);
    v1.push_back(2);
    vector<int>::iterator it = v1.begin();
    while (it != v1.end()) {
        if (*it == 2) {
            it = v1.erase(it);   //删除后,迭代器指针会执行下一个位置并返回。
        }else{
            it++;
        }
    }

    //4 遍历打印
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

2、环台湾湖

string区间删除和插

string提供了inserterase分级实现插入和去操作。

栽:pos地方插入字符串s,再次来到新的string。

  • string &insert(int pos, const char *s)
  • string &insert(int pos, const string &s)

安插:pos地点插入n个字符c,重回string。

  • string &insert(int pos, int n, char c)

抹:删除从pos地点上马之n个字符,重临新的string

  • string &erase(int pos, int n)

删除:删除指定迭代器的职务,再次回到时迭代器地方

  • string::iterator erase(string::iterator it)

去除:删除迭代器之间的字符,左闭右起区间

  • string::iterator erase(string::iterator beginIt, string::iterator endIt)

int main(int argc, const char * argv[]) {

    string s1 = "hello1 world!";

    //1 删除字符串中的'1'
    //---通过find函数,查找'1'所在的迭代器位置
    string::iterator it = find(s1.begin(), s1.end(), '1');
    //---删除
    if (it != s1.end()) {
        s1.erase(it);
    }
    cout << s1 << endl;

    //2 删除起始迭代器位置的字符
    s1.erase(s1.begin(), s1.begin() + 3);
    cout << s1 << endl;

    //3 在0位置插入"AAA"
    s1.insert(0, "AAA");
    cout << s1 << endl;

    return 0;
}

弃政治不说话,对于骑行党来说,四川底诱惑力绝不在另外一样长条上藏路线之下。因为简单的十几龙旅途,意义不仅是好上千公里之程,而是感受满满的青海风俗,再趁来几个深游,不枉“出国”骑行一不成。

STL中的stack栈容器

每当数据结构中,栈是相同种植先称后出之器皿,增欧元素于压栈或者入栈。移除元素通常称为出栈。

STL提供的stack容器,也是这种基本类型。这里大家演示一下骨干元素类型和复杂因素类型。

▽ 基础数据类型的stack

int main(int argc, const char * argv[]) {

    //定义stack对象
    stack<int> s1;

    //入栈
    s1.push(1);
    s1.push(2);
    s1.push(3);
    s1.push(4);

    //打印栈顶元素,并出栈
    while (!s1.empty()) {
        //取出栈顶元素
        cout << "当前栈顶元素" << s1.top() << endl;

        //获取栈的大小
        cout << "当前栈的大小" << s1.size() << endl;

        //出栈
        s1.pop();
    }

    return 0;
}

▽ 复杂数据类的stack

//定义类
class Teacher {

public:

    char name[32];
    int  age;

    void printT()
    {
        cout << "age = " << age << endl;
    }

};

int main(int argc, const char * argv[]) {

    Teacher t1, t2, t3;
    t1.age = 22;
    t2.age = 33;
    t3.age = 44;

    //定义栈容器
    stack<Teacher> s1;

    //入栈
    s1.push(t1);
    s1.push(t2);
    s1.push(t3);

    //出栈并打印
    while (!s1.empty()) {
        //打印栈顶元素
        Teacher tmp = s1.top();
        tmp.printT();

        //出栈
        s1.pop();
    }

    return 0;
}

除外珠峰珍重区的这么些土石路,基本沿路到318都是上好的沥青路面。可是即便看上去相当盛的金科玉律,不过自己单独于庆阳和樟木住上了会洗澡到地点……所以对待叫川藏这样成熟之骑行路,中尼路沿途服务的首要性对象或因为这个中距离列车司机如故一般游客。

multimap容器

multimap容器,与map容器的绝无仅有区别是:multimap辅助多独键值。

是因为协助两只键值,multimap提供了cout函数来算和一个key的素个数。

class Person {


public:

    string name;    //姓名
    int age;        //年龄
    string tel;     //电话
    double sal;     //工资

};

void test()
{
    Person p1,p2,p3,p4,p5;
    p1.name = "王1";
    p1.age  = 31;

    p2.name = "王2";
    p2.age  = 31;

    p3.name = "张3";
    p3.age  = 31;

    p4.name = "张4";
    p4.age  = 31;

    p5.name = "钱5";
    p5.age  = 31;


    multimap<string, Person> map2;

    //sale部门
    map2.insert(make_pair("sale", p1));
    map2.insert(make_pair("sale", p2));

    //development部门
    map2.insert(make_pair("development", p3));
    map2.insert(make_pair("development", p4));

    //Finanncial部门
    map2.insert(make_pair("Finanncial", p5));


    //遍历
    for (multimap<string, Person>::iterator it = map2.begin(); it != map2.end(); it++) {


        cout << it->first << "\t" << it->second.name << endl;

    }

    //按部门显示员工信息
    int developNum = (int) map2.count("development");
    cout << "development部门人数:" << developNum << endl;
    multimap<string,Person>::iterator it2 = map2.find("development");
    int tag = 0;
    while (it2 != map2.end() && tag < developNum) {
        cout << it2->first << "\t" << it2->second.name <<endl;
        it2 ++;
        tag ++;
    }

    //把age=32 修改name= 32
    for (multimap<string, Person>::iterator it = map2.begin(); it != map2.end(); it++) {
        if (it->second.age == 32) {
            it->second.name = "32";
        }
    }
}

int main(int argc, const char * argv[]) {

    test();

    return 0;
}

黑龙江岛平均气温27℃,雨量小,适合骑行。不提倡春季高温暴晒、冬日强台风阴雨时骑行者路。骑行用时8~10天。

string算法相关

脚下大面积的string的算法是大小写转换。一般以函数transform来拓展更换。

int main(int argc, const char * argv[]) {

    string s1 = "abcdefg";
    string s2 = "AEDLFLKJDLKJFL";

    //小写全部转换成大写,转换的结果放在s1.begin()的位置,后面的操作需要强制转换成指定的函数类型
    transform(s1.begin(), s1.end(), s1.begin(), (int (*)(int))toupper);
    cout << s1 <<endl;

    //大写全部转换成小写
    transform(s2.begin(), s2.end(), s2.begin(), (int (*)(int))tolower);
    cout << s2 <<endl;

    return 0;
}

相比叫江苏汀看人文景象,未经深度开发的海南岛或者比老的状态。大片的雨林和秀美的自然环境,置身其中,让丁返璞归真的觉得。

STL容器的较

STL提供了众器皿,每种容器有这些自身之特色,我们欠怎么以它啊?

vector deque list set mutliset map multimap
内存结构 单端数组 双端数组 双向链表 二叉树 二叉树 二叉树 二叉树
随机存取 对key而言是
查找速度 非常慢 对key而言快 对key而言快
插入删除 尾端 头尾两端 任何位置 $1

路线特点:东线包括223国道与201看望道,这段路海拔基本在10米左右,路况好,没什么坡,在此处骑行简直是一样种享受。中线以224国道为主线,途经五台山,不过海拔为便500米左右,没什么不行坡。

list的删除

list提供了点儿独函数用来删除元素,分别是eraseremove

  • erase是经岗位依旧区间来删除,紧要构成迭代器指针来操作
  • remove凡是通过价值来删除

int main(int argc, const char * argv[]) {

    //创建list对象
    list<int> l;

    //添加数据
    for (int i = 0; i < 10; i++) {
        l.push_back(i);
    }
    l.push_back(100);
    l.push_back(100);

    //删除头部元素
    l.erase(l.begin());

    //删除某个区间
    list<int>::iterator it = l.begin();
    it++;
    it++;
    it++;
    l.erase(l.begin(), it);

    //移除值为100的所有元素
    l.remove(100);

    //遍历
    for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

无限风光在巅峰,新藏线有着他的难度,然而他吧保有无与伦比的美景,冈仁波齐同玛旁雍错就当其左右。无论是哪个之“神山名次”,总起冈仁波齐的一席之地,而每年的转山活动同时使得他名誉甚益。玛旁雍错作为西藏三坏圣湖之一,有着不同平常之明丽风光。

vector的插入元素

vector提供了insert函数,结合迭代器地方插入指定的因素。

一经迭代器地方越界,会屏弃来老。

int main(int argc, const char * argv[]) {

    //初始化vector对象
    vector<int> v1(10);

    //在指定的位置插入元素10的拷贝
    v1.insert(v1.begin() + 3, 10);

    //在指定的位置插入3个元素11的拷贝
    v1.insert(v1.begin(), 3, 11);

    //遍历
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

注意事项:
“高寒缺氧”是青藏高原自然环境的优秀简便的席卷。高原的天气的劣往往让初至高原之人惊奇不已。在同等上间,可能相会更四季的气象,刚刚依旧艳阳高照,转瞬间便小暑纷飞。相对于川藏南线以来,青藏线应该是比轻松的,尽管沿途海拔较高,但相对于川藏线的凡事,这基本上全是以海拔3000上述骑行。唯一大家要翻的山,估量就是唐古拉山了。

下,大家会晤相继举办介绍。

当选理由:这是平等漫长道路法最好,沿途风景精彩,极具记念意义。

STL中的string

string是STL的字符串类型,在C语言中,我们普通用char *或者char[]字符数组来表示字符串。C++的string和C语言的char *发生什么区别吧?

  • string大凡一个看似,char *凡是恃于字符的指针
  • string封装了char *,管理这字符串,是一个char *色的容器
  • string不用考虑内存释放和数组越界
  • string提供了一部分排的字符串操作函数

骑单车绕江苏,那样的说教是勿是死了不起上?对于陕西乡土居民来说,这已经屡见不鲜,不过对于陆上民众来说,这尚是发出肯定困难的作业。环岛,早已超越了骑行本身,我们盖这样的主意去感受那非一致的知。

STL中的list容器

list容器具有如下特征:

  • 足以脑部和尾部插入和去元素
  • 匪可知随便访问元素,也即是迭代器只好只好++,不克四遍性跳转

3、中尼线

vector的遍历

vector的遍历有多措施,可以依据[]要么迭代器遍历。

需要重点的凡:

  • []计,假使越界或出现其他左,不会晤弃来特别,可能汇合崩溃,可能数量随机出现
  • at办法,假若越界或出现任何左,会丢掉来老,需要捕获非常并处理
  • 迭代器提供了逆向遍历,可以通过迭代器来实现逆向遍历,当然者二种办法呢得以

int main(int argc, const char * argv[]) {

    //创建vector
    vector<int> v1;

    //插入元素
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }

    //遍历-[]取值
    for (int i = 0; i < v1.size(); i++) {
        cout << v1[i] << " ";
    }
    cout << endl;

    //遍历-at取值
    for (int i = 0; i < v1.size(); i++) {
        cout << v1.at(i) << " ";
    }
    cout << endl;

    //遍历-迭代器遍历
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    //遍历-迭代器逆向遍历
    for (vector<int>::reverse_iterator it = v1.rbegin(); it != v1.rend(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    //测试越界
    cout << "[]越界:" << v1[20] << endl;      //不会抛出异常,可能会崩溃,可能会乱码
    cout << "at越界:" << v1.at(20) << endl;   //会抛出异常,需要捕获异常

    return 0;
}

骑行中尼路底充裕特别片段因,是以想成功318之希望,而自当时骑行则是坐时还多,想去珠峰探访,去尼泊尔一日游,恰好有这么一久现成的公路摆在那么,不骑也便浪费了。后来想想,这十几龙接触骑行确实怪值得特别赞,完全和川藏不一致的感触。

平常数据类型的排序

set容器是不变的成团,默认的次第是自小到特此外。

创办集合的道:

  • set<int>成立默认的从小到不行的int类型的会聚
  • set<int,less<int>>始建一个从小由至好的int类型的集
  • set<int,greater<int>>制造一个从很至小之int类型的联谊

面的less和greater就是仿函数,集合会依照此仿函数的再次来到值是否也真类进行排序。

//仿函数的原型,下面是C++提供的默认的greater的仿函数(删除了宏定义后的)
struct greater
{
    bool operator()(const int &left, const int &right) const
    {
        //如果左值>右值,为真。从大到小的排列
        return left > right;
    }
};

大家得测试下,添加进set集合的元素确实是来缘的。

void main()
{
    //默认,从小到大
    set<int> set1;
    //从小到大--默认就是
    set<int, less<int>> set2;
    //从大到小
    set<int, greater<int>> set3;

    //添加元素
    for (int i = 0; i < 5; i++) {
        int tmp = rand();
        set3.insert(tmp);
    }

    //遍历
    for (set<int>::iterator it = set3.begin(); it != set3.end(); it++) {
        cout<< *it << " ";
    }
}

适宜月份:二月、八月

STL容器的通用性探讨

至此处,STL的器皿我们基本教学停止了。STL的容器紧要利用了C++的沙盘特性来兑现。需要小心:

  • 容器缓存了节点,节点类要确保匡助拷贝(否则出现浅拷贝问题,导致崩溃)
  • 容器被的形似节点类,需要提供拷贝构造函数,一视同仁载等号操作符(用来赋值)
  • 容器在插入元素时,会自动进行元素的正片。

针对容器,容器中吧支撑拷贝。所以要留意:

  • 除queue和stack外,每个容器都提供了而是回到迭代器的函数,运用重回的跌打器就得看元素
  • 司空眼惯STL不相会扔来怪,要求使用者确保传入正确的参数
  • 每个容器都提供了一个默认构造函数和一个默认拷贝构造函数

图表是在下当年环湖所拍,应该可以适合豪门之法眼吧。(摄于环湖西路)

pair类型的重临值

pair类型,就恍如于斯威夫特(Swift)(Swift)语言中的“元组”的概念,那一个路涵盖了大多单数据类型,在函数再次回到的当儿,可以同时再次回到三只价值。

俺们来拘禁一下pair类型的概念其事实上是一个结构体。它包含了有限独特性,firstsecond

template <class _T1, class _T2>
struct pair
{
    typedef _T1 first_type;
    typedef _T2 second_type;

    _T1 first;
    _T2 second;
}

面的事例中,我们了然set集合中的素是绝无仅有的,重复的因素插入会破产。尽管判断是否插入成功,我们好透过insert函数的回值来判断,它的再次回到值是一个pair色。我们来拘禁一下insert函数的原型:

pair<iterator,bool> insert(const value_type& __v)

归来的是pair<iterator, bool>类别,pair的率先只属性表示手上安插的迭代器的地点,第二个属性表示插入是否成的bool值。所以,我们好透过第二只属性来判定元素是否插入成功。

//pair的使用判断set的insert函数的返回值
void test3()
{
    Student s1("s1",32);
    Student s2("s2",22);
    Student s3("s3",44);
    Student s4("s4",11);
    Student s5("s5",22);

    //创建集合,采用从小到大的排序
    set<Student, FuncStudent> set1;

    //插入数据,接收返回值
    pair<set<Student, FuncStudent>::iterator, bool> pair1 = set1.insert(s1);
    if (pair1.second == true) {
        cout << "插入s1成功" <<endl;
    }else{
        cout << "插入s1失败" <<endl;
    }
}

入选理由:都说唐宋看扶桑,民国看江西。书上的史总是大的,现实中的才是动。环岛的一律不行看点就是是错开看当年蒋公统治下的那么片土地。文化及之异样将是此行线路达最充足的特点。

  • 容器 container
  • 算法 algorthm
  • 迭代器 iterator
  • 仿函数 function object
  • 适配器 adaptor
  • 空中配置器 allocator

注意事项:无论路修的发多好,这里仍算是“生命的禁区”。由于大海拔和难补给,所以于那一个骑行经历一般,修车技术一般,心思素质一般的骑友不指出骑行是条路。

list的基本操作

int main(int argc, const char * argv[]) {

    //创建list对象
    list<int> l;

    //尾部添加元素
    for (int i = 0; i < 10; i++) {
        l.push_back(i);
    }

    //头部添加元素
    l.push_front(111);

    //遍历
    for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    //list不能随机访问
    list<int>::iterator it = l.begin();
    it++;
    it++;
    cout << *it <<endl;
//    it = it + 1;  //编译报错,不能随机访问
//    it = it + 5;  //编译报错,不能随机访问


    return 0;
}

前几日被大家推荐的即7漫长骑行路,相对与时俱进又无不经典。听说一起旅行同样蹩脚就是晤面化一辈子之爱人,毕业季要是交了,来同样次等终身难忘的骑行吧少年!

vector的push_back强化

push_back是当目前vector的内存末尾拷贝元素进入容器。注意这地点或者有浅拷贝,所以容器被的对象要协助拷贝操作。另外,如若vector起头化了个数,而不起先化具体的价值,push_back为无非会以终极对多。

int main(int argc, const char * argv[]) {

    //初始化10个元素的容器
    vector<int> v(10);

    //打印容器大小
    cout << v.size() << endl;

    //push_back添加元素
    v.push_back(100);

    //打印容器大小
    cout << v.size() << endl;

    //遍历后的结果是  0 0 0 0 0 0 0 0 0 0 100
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

适宜月份:8月—18月,七月—三月

打定义对象的排序

下面,大家视了基础的数据类型的会面,是得排序的。不过,假设凑里面放的凡不同经常之自定义对象,该如何满意set有序的特色也?

透过者的事例,我们精晓,基础数据类型的set是板上钉钉的机要原因是greater和less仿函数。所以,自定义对象的有序也是透过我们打定义仿函数来管的。

仿函数,之所以为仿函数,是坐它们跟函数很像,但连无是一个函数。它的结果如下,只要大家贯彻了这仿函数,我们啊得以对自定义对象举办排序。

//定义仿函数的结构体
struct FunctionName
{
    //重载了()运算符,实现两个自定义对象的比较
    bool opeartor() (Type &left, Type &right)
    {
        //左值大于右值,从大到小的顺序
        if(left > right) 
            return true;
        else
            return false;

    }
};

下面,我们打定义一个Student对象,按照年龄举办排序,将对象参预到set集合中,并开展打印。

设仿函数实现了按照年龄举行排序,因为set是素唯一的,所以在插入对象的下,尽管年龄是双重的,则插入不登了。

//定义student对象
class Student {
public:
    Student(const char *name, int age)
    {
        strcpy(this->name, name);
        this->age = age;
    }

public:
    char name[64];
    int  age;
};

//提供仿函数,用于自定义对象的set进行排序,要写一个仿函数,用来排序
struct FuncStudent
{
    //重载了括号操作符,用来比较大小
    bool operator() (const Student &left, const Student &right)
    {
        //如果左边比右边小,从小到大按照年龄排序
        if(left.age < right.age)
            return true;
        else
            return false;
    }

};

void main()
{
    Student s1("s1",32);
    Student s2("s2",22);
    Student s3("s3",44);
    Student s4("s4",11);
    Student s5("s5",22); 

    //创建集合,采用从小到大的排序
    set<Student, FuncStudent> set1;

    //插入数据
    set1.insert(s1);
    set1.insert(s2);
    set1.insert(s3);
    set1.insert(s4);
    //插入不进去(年龄有重复的,所以插不进去了),要通过返回值来确保是否插入成功
    set1.insert(s5);    

    //遍历
    for (set<Student>::iterator it = set1.begin(); it != set1.end(); it++) {
        cout << it->age << "\t" << it->name <<endl;
    }

}

线特点:骑友稀少,你将体会至跟川藏线不均等的感到。

multiset容器

multiset容器,与set容器相似,不过multiset容器被的因素得以还。另外,他也是活动排序的,容器内的价值不克随便修改,因为起各样的。

void test5()
{
    //定义multiset
    multiset<int> set1;

    //从键盘不停的接收值
    int tmp = 0;
    printf("请输入multiset集合的值:");
    scanf("%d", &tmp);
    while (tmp != 0) {
        set1.insert(tmp);
        scanf("%d", &tmp);
    }

    //迭代器遍历
    for (multiset<int>::iterator it = set1.begin(); it != set1.end(); it++) {
        cout<< *it <<" ";
    }
    cout <<endl;

    //删除
    while (!set1.empty()) {
        multiset<int>::iterator it = set1.begin();
        cout << *it << " ";
        set1.erase(it);
    }
}

于举荐的即刻几条线中,海南湖属于一个远距离线路,4上之年月充裕好,而且马年转山,羊年转湖。浙江湖不仅有着清秀的湖光山色,成片的油菜花海也是同等杀看点。由于杰出的地理地方和天条件,江苏湖之菜花丛每年的十一月之才起开,相比较南方3、9月份那多少个开放之田间油菜花,山呼伦湖及自的百里油菜花海丰盛让你感动。

STL容器的因素拷贝

下,我们演示一下,假若容器元素如无落实拷贝构造函数,现身浅拷贝后底崩溃问题。

#include <iostream>
#include <string>
#include <vector>
using namespace std;


class Student {

public:
    Student(const char *name, int age)
    {
        cout << "构造函数" << endl;

        //分配内存空间
        m_name = new char[strlen(name) + 1];
        //值拷贝
        strcpy(m_name, name);

        m_age = age;
    }


    ~Student()
    {
        printf("%p 指向的空间 调用析构函数\n", m_name);
        if (m_name != NULL) {
            delete []m_name;
            m_age = 0;
        }
    }

private:
    char *m_name;
    int   m_age;

};


int main()
{
    Student s1("chenhua",24);

    vector<Student> v1;
    v1.push_back(s1);

    return 0;
}

点的代码段,运行后底结果如下:

构造函数
0x100302a00 指向的空间 调用析构函数
0x100302a00 指向的空间 调用析构函数

运转后,打印出结果后连报错。报错原因是和一个内存空间被保释了2次,导致的崩溃。其根本原因是,v1将s1拷贝到容器,由于Student没有重写拷贝构造函数,从而出现了浅拷贝,只拷贝了地址。释放的时候一定出现谬误。

一经大家于Student重写了拷贝构造函数和重载了异常号操作符,则上边的谬误就是不碰面产出。

//重写拷贝构造函数
Student(const Student &obj)
{
    //分配内存空间
    m_name = new char[strlen(obj.m_name) + 1];
    //值拷贝
    strcpy(m_name, obj.m_name);

    m_age = obj.m_age;
}

//重载等号运算符
Student & operator=(const Student &obj)
{
    //释放旧值
    if (m_name != NULL) {
        delete [] m_name;
        m_age = 0;
    }

    //分配内存空间并赋值
    m_name = new char[strlen(obj.m_name) + 1];
    strcpy(m_name, obj.m_name);
    m_age = obj.m_age;

    return *this;
}

当选理由:夏日洒满温暖阳光之陕西岛凡骑友们的西方。海浪、沙滩、椰林,风景如画,再添加难度十分的骑行路,让众多骑友们涌向浙江。

string与char *的转换

string提供了成员函数c_str来以string对象转化成const char *。string提供了copy(buf,size,begin)成员函数来讲string从begin职上马的size只字符拷贝到buf惨遭。需要专注的是:

  • 倘buf容纳不生,会越界
  • 拷贝过去晚,不相会变卦成C风格的字符串,也就是是无会合于buf前面加加’\0′

int main(int argc, const char * argv[]) {

    //1 string转char *
    string str("aaaaaa");
    const char *p = str.c_str();

    //2 char *转string
    const char *p1 = "12345";
    string str2 = p1;

    //3 string拷贝到buf[]中
    char buf[128] = {0};
    //从0开始,拷贝3个字符到buf指向的内存空间
    //如果buf空间容纳不下,会越界
    //拷贝过去时,不会给buf末尾添加\0
    str.copy(buf, 3, 0);

    return 0;
}

注意事项:由于这一个条路属于边境线路,假若无过去尼泊尔,则用做边防证(户籍所在地警方即可办理)。由于遭此次尼泊尔地震的熏陶,现在打岗噶起先道路被损毁,能否通行需要小心相关政党消息。

STL中的vector容器

vector大凡用元素放到动态数组中加以管理的器皿。vector容器能够随机存取元素,也就是说辅助[]运算符和at计存取。

  • vector每当尾部添加或移除元素相当快,在中游操作特别耗时,因为她需活动元素

鸟岛最佳的观鸟季节是在5~1月,可是十二月温度相比较逊色,不正好骑行。

vector的起先化

vector有4种艺术开头化,有从来初步化,也如经过拷贝构造函数最先化。

int main(int argc, const char * argv[]) {

    //直接构造函数初始化
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);

    //通过拷贝构造函数初始化
    vector<int> v2 = v1;

    //使用部分元素来构造
    vector<int> v3(v1.begin(), v1.begin() + 1);
    vector<int> v4(v1.begin(), v1.end());

    //存放三个元素,每个元素都是9
    vector<int> v5(3,9);

    return 0;
}

入选理由:环游广霍鲁逊湖,是多多益善骑行路中最经典的同样久,深受大家之珍视。黑龙江湖凡高原圣湖,景象精粹,西北边的鸟岛栖堪称“鸟之帝国”。

STL中的set和multiset集合容器

set是一个集,Objective-C言语中为发出集的定义。C++中之集结与OC中的集也起差之地方。

  • C++的set容器,其中蕴含的素是唯一的,而且是不变的。
  • C++的set容器,是依顺序插入的,无法在指定地方插入。
  • C++的set容器,其结构是吉利黑二交叉树,插入数据的功能相比较vector快

注意事项:特殊情形下丰硕有或会晤于一月或者12月的垭口碰到小雪,诸如102塌方区,邦达72拐这多少个特种地区需要特别注意安全。

字符串的遍历

字符串的遍历,有两种植遍历的章程

  • 数组情势遍历,通过[]操作符遍历 (不会晤丢掉来老)
  • at()方法遍历,依照index取值 (会放任来异常)
  • 透过STL迭代器遍历

int main(int argc, const char * argv[]) {

    //创建字符串对象
    string str("abcdefg");

    //数组形式遍历
    for (int i = 0; i < str.length(); i++) {
        cout<< str[i] << endl;
    }

    //at方法遍历
    for (int i = 0; i < str.length(); i++) {
        cout << str.at(i) << endl;
    }

    //迭代器遍历
    for (string::iterator it = str.begin(); it != str.end(); it++) {
        cout << *it << endl;
    }

    return 0;
}

数组情势和at方法措施,有一个引人注目标差

  • 数组形式,即使出现越界或者此外左,不会见丢来特别,程序间接终端。
  • at()方法遍历,出现越界或其他左,会扔来老,程序可以拍卖分外。

迭代器其实可以看成是一个字符的指针,上个例证中string::iterator it = str.begin()便是概念一个string类型的迭代器,指向str的第一糟位置。*it固然象征即之字符。注意str.end()意味着字符串最终一个字符的背后一个职。假如it == str.end()哪怕象征既遍历到终点了。

上榜理由:“行车新藏线,甚于蜀道难;库地达到坂险,犹似鬼门关;麻扎达坂尖,陡升五千老三;黑卡达坂旋,九十九道湾;界山达坂弯,伸手可摸天……”这是无限困顿、最考验意志、环境最恶劣、人烟最稀有的顶峰骑行路,难度远在川藏线之上。走旁人不敢走之行程,看旁人没有看了的山山水水,大概说爆发了采取新藏线的骑友的肺腑之言。

STL初探

容器是STL中深关键之一模一样栽多少结构。常见的器皿包括

  • vector容器
  • deque双端数组
  • stack栈模型
  • queue队列模型
  • list链表模型
  • priotriy_queue优先级列
  • set与multiset容器
  • map与multimap容器

除外容器,STL还包裹了有力的算法,可以实现查找、删除、替换、删除等过剩大操作。后边会重要教学。

此外,迭代器也是STL首要的如出一辙围,通过迭代器,我们可以好有益于对容器被的元素举办遍历,以及操作容器。后边大家晤面通过插讲解迭代器。

适宜月份:8月、七月、10月、六月

现阶段STL有六至极组件

7、青藏线

set容器数据的检索

set容器提供了差不多单函数用来找元素

  • iterator find(const key_type& __k) find函数查找元素为k的迭代器地方
  • iterator lower_bound(const key_type& __k)
    lower_语言,bound函数查找小于等于元素k的迭代器地点
  • iterator upper_bound(const key_type& __k)
    upper_bound函数查找大于元素k的迭代器地点
  • pair<iterator,iterator> equal_range(const key_type& __k)
    equal_range函数再次来到一个pair类型,第一单特性表示过等于k的迭代器地点,第二只是大于k的迭代器地点

void test4()
{
    set<int> set1;

    for (int i = 0; i < 10; i++) {
        set1.insert(i+1);
    }

    //遍历
    for (set<int>::iterator it = set1.begin(); it != set1.end(); it++) {
        cout << *it <<endl;
    }

    //查找元素是5的迭代器位置
    set<int>::iterator it0 = set1.find(5);
    cout << "it0:" << *it0 <<endl;

    //查找小于等于5的元素迭代器位置
    set<int>::iterator it1 = set1.lower_bound(5);
    cout << "it1:" << *it1 <<endl;

    //查找大于5的元素迭代器位置
    set<int>::iterator it2 = set1.upper_bound(5);
    cout << "it2:" << *it2 <<endl;

    //返回的pair第一个迭代器是>=5,另一个是>5
    pair<set<int>::iterator, set<int>::iterator> mypair = set1.equal_range(5);
    set<int>::iterator it3 = mypair.first;
    set<int>::iterator it4 = mypair.second;
    cout << "it3:" << *it3 <<endl;
    cout << "it4:" << *it4 <<endl; 
}

注意事项:由于环岛骑行,卓越给“出国”,准备事项较多,怎样出入境等题材都得细考虑。好以和根同源,不用在山西担心语言的题材。

STL中的deque容器

deque是一个双端数组容器:可以在头和尾巴操作元素。

  • push_back 从尾部插入元素
  • push_front 从头部插入元素
  • pop_back 从尾部删除元素
  • pop_front 从首删除元素

知识点:

distance函数可以求出当前底迭代器指针it距离头部的职位,也即是容器的指针

用法: distance(v1.begin(), it)

int main(int argc, const char * argv[]) {

    //定义deque对象
    deque<int> d1;

    //尾部插入元素
    d1.push_back(10);
    d1.push_back(20);
    d1.push_back(30);

    //头部插入元素
    d1.push_front(1);
    d1.push_front(2);
    d1.push_front(3);

    //尾部删除元素
    d1.pop_back();

    //头部删除元素
    d1.pop_front();

    //修改头部和尾部的值
    d1.front() = 111;
    d1.back()  = 222;

    //查找元素为1的下标
    //通过distance求取下标
    deque<int>::iterator it = d1.begin();
    while (it != d1.end()) {
        if (*it == 1) {
            cout << "下标:" << distance(d1.begin(), it) << endl;
        }
        it++;
    }

    //遍历
    for (deque<int>::iterator it = d1.begin(); it != d1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

围绕不了宝岛湖北?不要难过,大家无尚暴发漂亮的江西岛么!陕西岛面积小于湖北岛,地处热带北缘,属热带季风气候,长夏任冬,年平均气温22~27℃,即使极冷之十二月份热度以暴发17~24℃。这样的天气条件,对于骑行者来说,几乎全年都可以来骑行。可是由于7、十月最好烫,且不时发生光风光临,所以骑行江西岛吧起较稳的极端时光。

map元素的物色

map提供了区区个函数举办key的找:find和equal_range。

int main()
{
    //定义map
    map<int ,string> map1;
    map1[1] = "chenhua";
    map1[2] = "mengna";

    //查找key=100的键值对
    map<int, string>::iterator it = map1.find(100);
    if (it != map1.end()) {
        cout << "存在key=100的键值对";
    }else{
        cout << "不存在" << endl;
    }


    //查找key = 1000的位置
    //返回两个迭代器,第一个表示<=1000的迭代器位置,第二个是>1000的迭代器位置
    pair<map<int, string>::iterator, map<int, string>::iterator> mypair = map1.equal_range(1000);
    if (mypair.first == map1.end()) {
        cout << "大于等于5的位置不存在" << endl;
    }else{
        cout << mypair.first->first << "\t" << mypair.first->second << endl;
    }

    if (mypair.second == map1.end()) {
        cout << "大于5的位置不存在" << endl;
    }else{
        cout << mypair.second->first << "\t" << mypair.second->second << endl;
    }

    return 0;
}

适宜月份:十月、二月

map元素的增删改查

map元素的插入,有零星种植方法:

  1. 调用insert函数插入pair类型的键值对
  2. 直白运用[]来对键举行复制,类似于Objective-C中之NSMutableDictionary赋值一样。

map的insert函数再次回到的凡pair类型,pair的第二单参数表示是否插入成功。即使插入的要素键名相同,则插入败北。

map元素的删减,跟方其他的容器一样,都是平昔调用erase函数.

int main()
{
    map<int, string> map1;

    //insert方法插入
    //--1 通过pair<int, string>(1,”chenhua“) 构造pair元素
    map1.insert(pair<int, string>(1,"chenhua"));
    //--2 通过make_pair构造pair元素
    map1.insert(make_pair(2,"mengna"));
    //--3 通过value_type构造pair元素
    map1.insert(map<int, string>::value_type(3,"chenmeng"));

    //[]直接插入
    map1[4] = "menghua";

    //重复插入(插入会不成功)
    pair<map<int, string>::iterator, bool> pair1 = map1.insert(make_pair(2, "haha"));
    if (pair1.second) {
        cout << "重复插入成功" << endl;
    }else{
        cout << "重复插入失败" << endl;
    }

    //元素的修改
    //map[1] = "22"的方式,如果不存在键则插入,存在键则修改
    map1[2] = "haha";

    //元素的删除
    //--删除值为"haha"的元素
    for (map<int, string>::iterator it = map1.begin(); it != map1.end(); it++) {
        if (it->second.compare("haha") == 0) {
            map1.erase(it);
        }
    }

    //遍历
    for (map<int, string>::iterator it = map1.begin(); it != map1.end(); it++) {
        cout << it->first << "\t" << it->second << endl;
    }

    return 0;
}

避让了藏区的雨季和7、11月份之暑季学生队伍容貌。

STL(标准模板库),是眼下C++内置辅助的library。它的底层以了C++类模板与函数模板的编制,由三死组成部分构成:容器、算法和迭代器。

6、新藏线

string的拼接

string为咱提供了少数栽字符串拼接形式,一栽是双重写了 +
操作符,我们得以一贯用连个字符串相加,类似于java的语法。另一样种是string提供了成员函数append()供大家并连续个字符串.

int main(int argc, const char * argv[]) {

    string s1 = "123456";
    string s2 = "abcdef";

    //直接使用加号运算符拼接
    string s3 = s1 + s2;

    //使用成员函数拼接
    string s4 = s1.append(s2);

    cout<<s3<<endl;
    cout<<s4<<endl;

    return 0;
}

川藏线,顾名思义,连接黑龙江及西藏之一律漫漫直通大动脉。川藏线是318国道的等同组成部分,因该以短短的2000差不多海里路上,浓缩了各式美景,成为了具有骑行爱好者魂牵梦萦之平长达路子。

string的构造函数

既然string是一个看似,那么为尽管发构造函数,我们探讨下string的构造函数。

#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {

    //通过const char * 初始化
    string s1 = "aaaa";

    //构造函数初始化
    string s2("bbbbb");

    //通过拷贝构造函数来初始化对象s3
    string s3 = s2;

    //用10个'a'字符来初始化字符串
    string s4(10, 'a');

    return 0;
}

当选理由:进藏的经文骑行路,也是上前藏线路中景象最得意的,高山草场、滚滚长河、皑皑雪山交替出现。这长达路线每年还吸引着不同地域、不同年龄的车友踏上道路,其中的
119道班更是为周边骑友通晓。同时,这也是相同长达万分困难的路。

STL中之queue队列容器

队是一律栽多少结构,具备队头和队尾。常见的生FIFO(先入先出)队列等。

#include <queue>

void main()
{
    queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);

    cout << "对头元素" << q.front() <<endl;
    cout << "队列的大小 " << q.size() <<endl;

    while (!q.empty())�{

        int tmp = q.front();
        cout << tmp << " ";
        q.pop();
    }
}



class Teacher
{
public:
    int age;
    char name[32];

    void printT()
    {
        cout << "age :" << age <<endl;
    }
}

void main()
{
    Teacher t1,t2,t3;
    t1.age = 31;
    t2.age = 32;
    t3.age = 33;

    queue<Teacher > q;
    q.push(t1);
    q.push(t2);
    q.push(t3);

    while (!q.empty())�{

        Teacher tmp = q.front();
        tmp.printT();
        q.pop();
    }

}

适宜月份:7~十一月,因为此时节的天气最温暖,也最为有或挑战成功。骑行用时30~40天。

string的摸和替换

string类提供了find函数,用来索字符串中指定的字符。提供了replace函数,用来替换字符串中指定地点的字符串。

replace函数是,先去指定地方,指定长度的字符,然后于此时此刻指定地方插入新的字符。

int main(int argc, const char * argv[]) {


    string s1 = "hello hello hello hello hello hello 1234 7876";

    //从0位置开始查找第一个hello出现的首位位置
    size_t index1 = s1.find("hello",0);
    cout << index1 << endl;

    //查找第一个hello出现时的首位位置
    size_t index2 = s1.find_first_of("hello");
    cout << index2 << endl;

    //查找最后一个hello出现时的末尾位置
    size_t index3 = s1.find_last_of("hello");
    cout << index3 << endl;

    //求hello出现的次数,以及对应的下标
    int count = 0;
    size_t offindex = s1.find("hello",0);
    while (offindex != string::npos) {  //如果 offindex != -1
        //找到了
        cout << "索引:" << offindex <<endl;
        count++;
        offindex++;
        offindex = s1.find("hello", offindex);
    }

    //把hello替换成welcome
    size_t offindex1 = s1.find("hello", 0);
    while (offindex1 != string::npos) {

        //从offindex1的位置开始删除5个位置,并插入新的字符串welcome
        s1.replace(offindex1, strlen("hello"), "welcome");

        //从后面的位置开始
        offindex1 += strlen("welcome");

        //继续查找
        offindex1 = s1.find("hello", offindex1);
    }
    cout << "替换后的字符串:" << s1 <<endl;

    return 0;
}

适宜月份:九月~ 次年5月

vector的着力用法

既是vector是容器,那么尽管得向者容器添加删减元素。

骨干用法:

  • front()回头部元素的援,可以当左值
  • back()归来尾部元素的援,可以当左值
  • push_back()填补港币素,只好尾部添加
  • pop_back()移除元素,只好在尾部移除

int main(int argc, const char * argv[]) {

    //定义一个vector容器
    vector<int> v1;

    //插入元素(尾部插入)
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);

    //迭代器遍历打印
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    //修改头部元素的值(front()返回是引用,可以当左值)
    v1.front() = 44;

    //输出头部元素
    cout<< "头部元素:" << v1.front() << endl;

    //修改尾部的值(back()返回是引用,可以当左值)
    v1.back() = 99;

    //输出尾部元素
    cout << "尾部元素" << v1.back() <<endl;

    //删除元素(从尾部删除)
    v1.pop_back();

    //迭代器遍历打印
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

注意事项:由于四川岛全境的支付还非完整,个别地点则连着了公路,却还绝对贫穷落后,且有路段也说不定于难走,需要发出必然心绪准备。

STL中的map和multimap映射容器

map和multimap是一个键值映射的容器。map中的键值对如故绝无仅有的,不过multimap中一个键得对承诺多单价值。

  • map和multimap是关联式容器,键值成对是
  • map和multimap是红黑变体的平衡二叉树结构
  • map只帮忙唯一的键值对,集合中之素是以一定的顺序排列的
  • multimap中的键可以出现频
  • map和multimap的因素插入过程是按部就班顺序插入的

5、环黑龙江岛骑行

set元素的插入和去

set提供了inserterase函数,用来对素举行扦插和去操作。

  • 基础项目数据,尽管插入的是双重的要素,则插入失利,重回值是一个pair类型
  • pair类型类似于swift语言中的元组的定义,通过该判断是否插入成功
  • 复杂类型数据,需要经仿函数来规定因素的相继,进入判断是否是再元素。在“自定义对象的排序”里面讲解。

void main()
{
    set<int> set1;

    //插入元素
    for (int i = 0; i<5; i++) {
        int tmp = rand();
        set1.insert(tmp);
    }

    //重复插入元素(会插入不成功,下一节会分析如果根据返回值判断是否插入成功)
    set1.insert(100);
    set1.insert(100);
    set1.insert(100);
    set1.insert(100);

    for (set<int>::iterator it = set1.begin(); it != set1.end(); it++) {
        cout << *it <<" ";
    }


    //删除集合
    while(!set1.empty())
    {
        //获取头部
        set<int>::iterator it = set1.begin();

        //打印头部元素
        cout << *it << endl;

        //从头部删除元素
        set1.erase(set1.begin());
    }

}

青藏线北起格尔木,南至商洛,全程大约1164公里,平均海拔在4500米以上。青藏公路全长1923km,海拔最低点为黄南藏族自治州1957米,最高点唐古拉山垭口5231米,格尔木至朔州段平均海拔4500米以上。公路东端穿越寸草不生的无垠戈壁滩;中段穿过渺无人烟的可可西里自然爱惜区;南端则穿广袤无垠的羌塘草原。这里的胜海拔为老百姓望而却步,被人们称“生命禁区”。

STL中的priority_queue优先级队列容器

优先级列分为:最小值优先队列和最可怜价值优先队列。

此间的无比酷价值、最小值是依靠队头的因素(增序、降序)。默认,是创设最要命价值优先级列。

概念优先级的法:

  • priority_queue<int>默认定义int类型的尽特别价值队列
  • priority_queue<int, vector<int>, less<int>>定义int型的太要命价值优先队列
  • priority_queue<int, vector<int>, greater<int>>定义int型的极其小值队列

地点的定义着,lessgreater非凡给谓词,是预约义好的排序函数,咱们誉为“仿函数”。前面会介绍其的用法。

void main()
{
    //定义优先级队列(默认是最大值优先级队列)
    priority_queue<int> p1;

    //定义一个最大优先级队列
    //less是提前定义好的预定义函数 相当于谓词
    priority_queue<int, vector<int>, less<int>> p2;

    //定义一个最小值优先级队列v
    priority_queue<int, vector<int>, greater<int>> p3;

    //给默认的最大优先级队列入栈
    p1.push(33);
    p1.push(11);
    p1.push(55);
    p1.push(22);

    //打印最大优先级的对头元素
    cout<<"对头元素:"<< p1.top() <<endl;
    cout<<"队列的大小:"<< p1.size() <<endl;

    //给最小值优先级队列入栈
    p3.push(33);
    p3.push(11);
    p3.push(55);
    p3.push(22);

    //打印最小优先级队列的对头元素
    cout<<"对头元素:"<< p3.top() <<endl;
    cout<<"队列的大小:"<< p3.size() <<endl;

}

中尼公路是西藏脚下唯一一久国际交通公路。它由河池启通过七台河、定日、聂拉木、樟木,友谊桥、尼泊尔京加德满都。中尼公路全长943公里,西藏境内829海里,此线在1965年建成通车后,每年由当下漫漫公路及遨游的旅游者不计其数,是西藏当下朝东南亚唯开放之国际公路。

作国内当下最火热之同等漫长骑行路,川藏线似乎日渐的上马变异相同种植属于自己之学识。作为给众人吐槽之人生4大俗之一,骑行川藏线值得可以商讨一番,我拿当接入下的稿子中说说好的见解。

网络寻找“国内经典骑行路”,出来的篇章就密密麻麻,不过浏览其内容也发现几都是平的,难道就多年排名都非会师变么?

作为连接新疆和西藏的相同条交通主动脉,由来已久,然而让普遍骑友视作骑行进藏的路线或近几年之从业。

线特点:从斯图加特出发,由东向西进入青藏高原,一路超越了南北走向底雅鲁藏布江、雅砻江、九龙江、金沙江、闽江、大黑河及其分水岭所成的道道屏障,翻越亏多山、高尔寺山、米拉山对等十差不多栋垭口才到锡林郭勒盟。除觉巴山垭口海拔3908米外,另外垭口海拔都超4000米,其中东达山垭口和米拉山垭口海拔达5000米以上。全线总长费劲且凶险,几乎每隔半龙即设翻越平幢大山,还要谨防泥石流、滑坡等地质灾害。即使路途凶险,风景也是举世无双,这为是川藏线最吸引人口的地点。

适宜月份:2月、十二月

线特点:新藏线平均海拔4500米以上,是社会风气日本首都拔高、道路最险、环境极恶劣之公路有。途中翻越5000米以上垭口5所,穿越举世著名的衡山、喀喇大茂山、冈底斯山、喜马拉雅山,全线经过的多数所在也“无人区”。一路达成设有风沙大、高寒缺氧、天气变化、补为不足等不方便,再添加路段几乎都是搓板路以及碎石路,陡坡很多,山体滑坡也发生,由此堪称“魔鬼路段”。

路线特点:全程海拔高,沿途食宿等非设另路线。

4、环陕西骑行

1、川藏线

当选理由:在那么多修上藏线路倍受,青藏线的难度相对来说不是那么大了。全程较平均的海拔和理想的公路养护,让你管需担心青藏线全线的路面处境。

线路特点:黑龙江湖环湖线路,因为环湖赛的因由,路况一级,有充裕好之骑行环境。湖面海拔3200米,那多少个海拔一般还无会晤发生高原反应。气候形成,早晚降温,但太阳辐射强,晋中充分。二月份白天一经阳光强烈,气温大约有10~20℃左右。

青藏线因为路上翻越黄山口、风火山口、大小唐古拉山口、申格里贡山口、念青唐古拉山口等海拔5000米以上的高山垭口;需通过荒凉之可可西里无人区和光袤的羌塘草原;需跨越昆仑河、楚玛尔河、沱沱河、通天河等于大江,几雅深山的连绵白雪,加上高原特有的蓝天白云,使得青藏线可以就此一个用语来概括:壮阔!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图