• Vector示例一,二


    #include <iostream>

    int main(void)

    {

    double a[] = {1, 2, 3, 4, 5};

    std::cout<<mean(a, 5)<<std::endl; // will print 3

    return 0;

    }

    //vector

    #include <vector>

    #include <iostream>

    int main()

    {

    std::vector<double> a;

    a.push_back(1);

    a.push_back(2);

    a.push_back(3);

    a.push_back(4);

    a.push_back(5);

    for(int i = 0; i < a.size(); ++i)

    {

    std::cout<<a[i]<<std::endl;

    }

    return 0;

    }

    #include <vector>

    #include <iostream>

    int main()

    {

    std::vector< int > q;

    q.push_back(10);

    q.push_back(11);

    q.push_back(12);

    std::vector< int > v;

    for(int i=0; i<5; ++i){

    v.push_back(i);

    }

    std::vector<int>::iterator it = v.begin() + 1;

    it = v.insert(it, 33);

    v.insert(it, q.begin(), q.end());

    it = v.begin() + 3;

    v.insert(it, 3, -1);

    it = v.begin() + 4;

    v.erase(it);

    it = v.begin() + 1;

    v.erase(it, it + 4);

    v.clear();

    return 0;

    }

    //程序:vector演示一

    //目的:理解STL中的向量

    // i nclude "stdafx.h" -如果你使用预编译的头文件就包含这个头文件

    i nclude <vector> // STL向量的头文件。这里没有".h"

    i nclude <iostream> // 包含cout对象的头文件。

    using namespace std; //保证在程序中可以使用std命名空间中的成员。

    char* szHW = "Hello World";

    //这是一个字符数组,以""结束。

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

    {

    vector <char> vec; //声明一个字符向量vector (STL中的数组)

    //为字符数组定义一个游标iterator

    vector <char>::iterator vi;

    //初始化字符向量,对整个字符串进行循环,

    //用来把数据填放到字符向量中,直到遇到""时结束。

    char* cptr = szHW; // 将一个指针指向"Hello World"字符串

    while (*cptr != '')

    { vec.push_back(*cptr); cptr++; }

    // push_back函数将数据放在向量的尾部。

    // 将向量中的字符一个个地显示在控制台

    for (vi=vec.begin(); vi!=vec.end(); vi++)

    // 这是STL循环的规范化的开始——通常是 "!=" 而不是 "<"

    // 因为"<" 在一些容器中没有定义。

    // begin()返回向量起始元素的游标(iterator),end()返回向量末尾元素的游标(iterator)。

    { cout << *vi; } // 使用运算符"*"将数据从游标指针中提取出来。

    cout << endl; // 换行

    return 0;

    }

    //程序:初始化演示

    //目的:为了说明STL中的向量是怎样初始化的。

    i nclude <cstring> // <cstring><string.h>相同

    i nclude <vector>

    using namespace std;

    int ar[10] = { 12, 45, 234, 64, 12, 35, 63, 23, 12, 55 };

    char* str = "Hello World";

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

    {

    vector <int> vec1(ar, ar+10);

    vector <char> vec2(str, str+strlen(str));

    return 0;

    }

    //程序:vector演示二

    //目的:理解带有数组下标和方括号的STL向量

    i nclude <cstring>

    i nclude <vector>

    i nclude <iostream>

    using namespace std;

    char* szHW = "Hello World";

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

    {

    vector <char> vec(strlen(szHW)); //为向量分配内存空间

    int i, k = 0;

    char* cptr = szHW;

    while (*cptr != '')

    { vec[k] = *cptr; cptr++; k++; }

    for (i=0; i<vec.size(); i++)

    { cout << vec[i]; }

    cout << endl;

    return 0;

    }

    //set

    /*这是微软帮助文档中对集合(set)的解释:"描述了一个控制变长元素序列的对象(注:set中的keyvalueKey类型的,而map中的keyvalue是一个pair结构中的两个分量)的模板类,每一个元素包含了一个排序键(sort key)和一个值(value)。对这个序列可以进行查找、插入、删除序列中的任意一个元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关系,并且当游标指向一个已删除的元素时,删除操作无效。"

    而一个经过更正的和更加实际的定义应该是:一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。如果你需要一个键/值对(pair)来存储数据,map是一个更好的选择。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。

    下面是一个例子:

    */

    //程序:set演示

    //目的:理解STL中的集合(set

    i nclude <string>

    i nclude <set>

    i nclude <iostream>

    using namespace std;

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

    {

    set <string> strset;

    set <string>::iterator si;

    strset.insert("cantaloupes");

    strset.insert("apple");

    strset.insert("orange");

    strset.insert("banana");

    strset.insert("grapes");

    strset.insert("grapes");

    for (si=strset.begin(); si!=strset.end(); si++)

    { cout << *si << " "; }

    cout << endl;

    return 0;

    }

    // 输出: apple banana cantaloupes grapes orange

    //注意:输出的集合中的元素是按字母大小顺序排列的,而且每个值都不重复。

    //如果你感兴趣的话,你可以将输出循环用下面的代码替换:

    copy(strset.begin(), strset.end(), ostream_iterator<string>(cout, " "));

    //map

    //程序:映射自定义的类。

    //目的:说明在map中怎样使用自定义的类。

    i nclude <string>

    i nclude <iostream>

    i nclude <vector>

    i nclude <map>

    using namespace std;

    class CStudent

    {

    public :

    int nStudentID;

    int nAge;

    public :

    //缺省构造函数——通常为空

    CStudent() { }

    // 完整的构造函数

    CStudent(int nSID, int nA) { nStudentID=nSID; nAge=nA; }

    //拷贝构造函数

    CStudent(const CStudent& ob)

    { nStudentID=ob.nStudentID; nAge=ob.nAge; }

    // 重载"="

    void operator = (const CStudent& ob)

    { nStudentID=ob.nStudentID; nAge=ob.nAge; }

    };

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

    {

    map <string, CStudent> mapStudent;

    mapStudent["Joe Lennon"] = CStudent(103547, 22);

    mapStudent["Phil McCartney"] = CStudent(100723, 22);

    mapStudent["Raoul Starr"] = CStudent(107350, 24);

    mapStudent["Gordon Hamilton"] = CStudent(102330, 22);

    // 通过姓名来访问Cstudent类中的成员

    cout << "The Student number for Joe Lennon is " <<

    (mapStudent["Joe Lennon"].nStudentID) << endl;

    return 0;

    }

    //Algorithms

    sort(vec.begin()+1, vec.end()-1)可以实现对除第一个和最后一个元素的其他元素的排序操作。

    //程序:测试分数统计

    //目的:通过对向量中保存的分数的操作说明怎样使用算法

    i nclude <algorithm> //如果要使用算法函数,你必须要包含这个头文件。

    i nclude <numeric> // 包含accumulate(求和)函数的头文件

    i nclude <vector>

    i nclude <iostream>

    using namespace std;

    int testscore[] = {67, 56, 24, 78, 99, 87, 56};

    //判断一个成绩是否通过了考试

    bool passed_test(int n)

    {

    return (n >= 60);

    }

    // 判断一个成绩是否不及格

    bool failed_test(int n)

    {

    return (n < 60);

    }

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

    {

    int total;

    // 初始化向量,使之能够装入testscore数组中的元素

    vector <int> vecTestScore(testscore,

    testscore + sizeof(testscore) / sizeof(int));

    vector <int>::iterator vi;

    // 排序并显示向量中的数据

    sort(vecTestScore.begin(), vecTestScore.end());

    cout << "Sorted Test Scores:" << endl;

    for (vi=vecTestScore.begin(); vi != vecTestScore.end(); vi++)

    { cout << *vi << ", "; }

    cout << endl;

    // 显示统计信息

    // min_element 返回一个 _iterator_ 类型的对象,该对象指向值最小的那个元素。

    //"*"运算符提取元素中的值。

    vi = min_element(vecTestScore.begin(), vecTestScore.end());

    cout << "The lowest score was " << *vi << "." << endl;

    //min_element类似,max_element是选出最大值。

    vi = max_element(vecTestScore.begin(), vecTestScore.end());

    cout << "The highest score was " << *vi << "." << endl;

    // 使用声明函数(predicate function,指vecTestScore.begin()vecTestScore.end())来确定通过考试的人数。

    cout << count_if(vecTestScore.begin(), vecTestScore.end(), passed_test) <<

    " out of " << vecTestScore.size() <<

    " students passed the test" << endl;

    // 确定有多少人考试挂了

    cout << count_if(vecTestScore.begin(),

    vecTestScore.end(), failed_test) <<

    " out of " << vecTestScore.size() <<

    " students failed the test" << endl;

    //计算成绩总和

    total = accumulate(vecTestScore.begin(),

    vecTestScore.end(), 0);

    // 计算显示平均成绩

    cout << "Average score was " <<

    (total / (int)(vecTestScore.size())) << endl;

    return 0;

    }

    一些建议

    为了避免在调试模式(debug mode)出现恼人的警告,使用下面的编译器命令:

    #pragma warning(disable: 4786)

    另一条需要注意的是,你必须确保在两个尖括号之间或尖括号和名字之间用空格隔开,因为是为了避免同">>"移位运算符混淆。比如

    vector <list<int>> veclis;

    这样写会报错,而这样写:

    vector <list <int> > veclis;

    就可以避免错误。

  • 相关阅读:
    带锚点URL同一页面滚动效果的实现
    思路先行
    transliteration -- 2个功能
    html5 section article
    fields('t')
    使用Bootstrap
    JavaScript Switch
    菜单
    写一个博客页面
    自动适应
  • 原文地址:https://www.cnblogs.com/timssd/p/4160669.html
Copyright © 2020-2023  润新知