zoukankan      html  css  js  c++  java
  • STL

    STL基本原理

    案例一:构建一个简易容器

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 //功能:查找一个容器中某元素个数
     6 int _find(int* start, int* end, int num)
     7 {
     8     int count = 0;
     9     while (start != end)
    10     {
    11         if (*start == num)
    12         {
    13             ++count;
    14         }
    15         ++start;
    16     }
    17     return count;
    18 }
    19 
    20 int main()
    21 {
    22     int _array[] = { 0,2,9,1,2,3,2 };
    23     /*int _array[6];
    24     int j = 0;
    25     for (auto& _element:_array)
    26     {
    27     _element = j*j;
    28     ++j;
    29     }
    30     int* end = &(_array[sizeof(_array)/sizeof(int) - 1]);
    31     cout << "*end = " << *end << endl;*/
    32 
    33     int* _begin = _array;//指针指向首元素
    34     int* _end = &(_array[sizeof(_array) / sizeof(int)]);
    35     int count;
    36     count = _find(_begin, _end, 2);
    37     cout << "count = " << count << endl;
    38     system("pause");
    39     return 1;
    40 }

      1 // string不同考虑越界问题,内存清理;所以在C++中建议你不要用char*,改用string
      2 // string是一个类
      3 
      4 #include<string>
      5 #include<iostream>
      6 
      7 using namespace std;
      8 
      9 void test02()
     10 {
     11     cout << " test02():" << endl;
     12     string strA = "shiruiyu";
     13     string strB;
     14 
     15     //成员函数 [] 遍历【越界不提醒!】
     16     for (int i = 0; i < strA.size(); i++)
     17     {
     18         cout << strA[i];
     19     }
     20     cout << endl;
     21     // 操作符  at 遍历【越界抛出异常】
     22     for (int i = 0; i < strA.size(); i++)
     23     {
     24         cout << strA.at(i);
     25     }
     26     cout << endl;
     27     try
     28     {
     29         //cout << strA.at(10) << endl;//越界 抛出异常 打印
     30         //cout << strA[10] << endl;//越界 不抛出异常
     31     }
     32     catch (const std::exception&)
     33     {
     34         cout << "越界!" << endl;
     35     }
     36 }
     37 
     38 //重载符
     39 void test04()
     40 {
     41     cout << " test04():" << endl;
     42     string s = "shi";
     43     string s2;
     44     s += s;
     45     cout << s << endl; // shishi
     46     string s3 = "rui";
     47     s.append(s3);
     48     cout << s << endl;// shishirui
     49 
     50     string s4 = "12345";
     51     string s5 = "678";
     52     s4.append(s5, 2, 1);//一般前面表示起始下标,后面表示个数(包含起始位置)
     53     cout << s4 << endl; // 123458
     54 }
     55 
     56 //查找
     57 void test05()
     58 {
     59     cout << " test05():" << endl;
     60     string s = "123454321";
     61     int pos = s.find("3");
     62     cout << "第一次出现位置:pos = " << pos <<endl;
     63     int _pos = s.find("5", 3);//4
     64     int __pos = s.find("454", 0,2);//从 0开始查找 “454”的前2个字符“45”第一次出现的位置
     65     int pos_ = s.rfind("3");
     66     cout << "最后一次出现位置:pos_ = " << pos_ << endl;
     67 }
     68 
     69 //替换
     70 void test06()
     71 {
     72     cout << " test06():" << endl;
     73     string s = "shiruiyu";
     74     s.replace(0, 3, "zhang");
     75     cout << "s = " << s.c_str() << endl;//zhangruiyu
     76 }
     77 //比较
     78 void test07()
     79 {
     80     cout << " test07():" << endl;
     81     string s1 = "abce";
     82     string s2 = "abcd";
     83     if (s1.compare(s2)== 0)
     84     {
     85         cout << "字符串相等!" << endl;
     86     }
     87     else if (s1.compare(s2) == 1)
     88     {
     89         cout << "s1 > s2" << endl;
     90     }
     91     else
     92     {
     93         cout << "s1 < s2" << endl;
     94     }
     95 }
     96 // 子串操着 和 删除
     97 void test08()
     98 {
     99     cout << " test08():" << endl;
    100     string s = "shiruiyu";
    101     //子串
    102     string mysub =  s.substr(1, 3);
    103     cout << mysub.c_str() << endl; // hir
    104 
    105     //删除
    106     s.erase(0, 2);//一般前面表示起始下标,后面表示个数(包含起始位置)
    107     cout << "删除前面两个s = " << s.c_str() << endl;// iruiyu
    108     s.insert(2, "2222");
    109     cout << "插入到第2个元素前面s = " << s.c_str() << endl;// ir2222uiyu
    110 }
    111 
    112 int main()
    113 {
    114     test02();
    115     test04();
    116     test05();
    117     test06();
    118     test07();
    119     test08();
    120     return 1;
    121 }

     find的例子:

    //代码来自   http://www.cplusplus.com/reference/string/string/find/
    // 这个网站可以在线编译
     1 // string::find
     2 #include <iostream>       // std::cout
     3 #include <string>         // std::string
     4 
     5 int main()
     6 {
     7     std::string str("There are two needles in this haystack with needles.");
     8     std::string str2("needle");
     9 
    10     // different member versions of find in the same order as above:
    11     std::size_t found = str.find(str2);
    12     if (found != std::string::npos)
    13         std::cout << "first 'needle' found at: " << found << '
    ';
    14     //可用于重复查找
    15     found = str.find("needles are small", found + 1, 6);// 从 found + 1 位置开始查找 needle 出现的位置
    16     if (found != std::string::npos)
    17         std::cout << "second 'needle' found at: " << found << '
    ';
    18 
    19     found = str.find("haystack");
    20     if (found != std::string::npos)
    21         std::cout << "'haystack' also found at: " << found << '
    ';
    22 
    23     found = str.find('.');
    24     if (found != std::string::npos)
    25         std::cout << "Period found at: " << found << '
    ';
    26 
    27     // let's replace the first needle:
    28     str.replace(str.find(str2), str2.length(), "preposition");// 这个替换功能很有趣
    29     std::cout << str << '
    ';
    30 
    31     return 0;
    32 }
     1 // string::find
     2 #include <iostream>       // std::cout
     3 #include <string>         // std::string
     4 #include<algorithm>
     5 #include<vector>
     6 using namespace std;
     7 int main()
     8 {
     9     std::string str("abc acc abc");
    10     // 查找某字符出现次数
    11     // <1> 直接遍历
    12     vector<int> positions;
    13     for (int i = 0; i < str.size(); i++)
    14     {
    15         if (str[i] == 'b')
    16         {
    17             positions.push_back(i);
    18         }
    19     }
    20     // <2> 利用find成员方法
    21     vector<int> positions_;
    22     std::size_t found = 0;
    23     while (true)
    24     {
    25         found = str.find("c", found, 1); // 第二次从“ acc abc”查找;应为下面 found++
    26         if (found == std::string::npos)
    27         {
    28             break;
    29         }
    30         cout << "found = " << (found) << endl;
    31         positions_.push_back(found);
    32         found++;
    33     }
    34     
    35 
    36     return 0;
    37 }
    
    
     1 // 参考: http://www.cnblogs.com/Pillar/p/4206452.html
     2 #include<string>
     3 #include<iostream>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     char* chars = "shiruiyu"; //对于 sizeof(chars)/sizeof(char)) new 的时候 +1 //遍历的时候不用
     9     // <1> char* 转 string
    10     string  string_ = chars;// 深度拷贝
    11     chars = "hehe";
    12     cout << chars << endl; // hehe
    13     cout << string_ << endl; // shiruiyu
    14     // <2> string 转char*
    15     const char* chars_ = new char[string_.size() + 1];
    16     string string__ = "china";
    17     chars_ = string__.data(); // 必须是const类型
    18     cout << chars_ << endl; // china
    19     return 1;
    20 }
    
    
    
     

     // string char* char 之间的转换

     1 #include<iostream>
     2 #include<string>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     string str1 = "shiruiyu";
     9     char* chars1 = new char[str1.size()]; // 接收string
    10     // string 转 char*
    11     strcpy(chars1, str1.c_str());
    12     cout << "chars1 = " << chars1 << endl;  // char* 可以直接打印
    13     // char* 转 string
    14     string str2 = chars1;
    15 
    16     // string 转 char
    17     char chars2[] = "";  // 接收string
    18     strcpy(chars2, str1.c_str());
    19     cout << "chars2 = " << chars2 << endl;
    20     // char 转 string
    21     string str3 = chars2;
    22     return 1;
    23 }

     【问题:sizeof 与 length(string的成员函数) 区别?】

    见我博客:https://www.cnblogs.com/winslam/p/9406330.html    【前几行】

  • 相关阅读:
    vue项目总结,所用到的技术点
    豆瓣电影个人项目总结
    博学谷项目总结,个人总结经验
    JavaScript数组的常用方法
    移动端base.css的内容,
    normalize.css可以对css初始化,不同浏览器可以统一初始样式
    jsp第十次作业
    jsp第九次作业
    jsp第八次作业
    jsp第七次作业
  • 原文地址:https://www.cnblogs.com/winslam/p/9405673.html
Copyright © 2011-2022 走看看