可对矢量执行的操作

所有的STL容器都提供了一个基本方法,其中包括

size() 返回容器中元素数目 swap() 交换两个容器的内容 begin() 返回一个指向容器中第一个元素的迭代器 end() 返回一个表示超过容器尾的迭代器

什么是迭代器?它是一个广义指针。事实上,它可以是指针,也可以是一个可对其执行类似指针的操作--如解除引用(如operator*())和递增(如operator++())的对象。通过将指针广义化为迭代器,让STL能够为各种不同的容器类(包括那些简单指针无法处理的类)提供统一的接口。每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef,其作用域为整个类。

例如,要为vector的double类型规范声明一个迭代器:

    vector<double>::iterator pd;
    假设scores是一个vector<double>对象:
    vector<double> scores;
    则可以使用迭代器pd执行这样的操作:
    pd = scores.begin();
    *pd = 22.3;
    ++pd;

迭代器的行为就像指针。

    C++11自动类型推断很有用的地方。
    例如,可以不这样做:
    vector<double>::iterator pd = scores.begin();
    而这样做:
    auto pd = scores.begin();

显示容器的内容

    using namespace std;
    vector<double> scores(5);
    for (int i = 10; i < 15; i++) {
        scores[i-10] = i;
    }
    vector<double>::iterator pd;
    for (pd = scores.begin(); pd != scores.end(); pd++) {
        cout << *pd << endl;
    }

vector模版类也包含一些只有某些STL容器才有的方法。push_back()将元素添加到矢量末尾。

erase()方法删除矢量中给定区间的元素。它接受两个迭代器参数,这些参数定义了要删除的区间。

    scores.erase(scores.begin(), scores.begin()+2); // [)

因此[begin(), end()]将包括结合的所有内容。

insert()方法的功能与erase()方法相反。它接受3个迭代器参数,第一个参数指定了新元素的插入位置,第二个和第三个迭起器参数定义了被插入的区间,该区间通常是另一个容器对象的一部分。

例如,将矢量new_v除第一个元素外的所有元素插入到old_v矢量的第一个元素前面:

    vector<int> old_v(5);
    vector<int> new_v(5);
    ...
    old_v.insert(old_v.begin(), new_v.begin()+1, new_v.end());

    old_v.insert(old_v.end(), new_v.begin()+1, new_v.end());

示例:

    struct Review
    {
        std::string title;
        int rating;
    };

    bool FillReview(Review &rr);
    void ShowReview(Review &rr);

    void VectorTest4()
    {
        using namespace std;
        Review temp;
        vector<Review> books;
        while(FillReview(temp))
        {
            books.push_back(temp);
        }
        unsigned long num = books.size();
        if(num > 0)
        {
            cout << "=======1" << endl;
            for (int i = 0; i < num; i++) {
                ShowReview(books[i]);
            }

            cout << "=======2" << endl;
            vector<Review>::iterator pr;
            for (pr = books.begin(); pr != books.end(); ++pr) {
                ShowReview(*pr);
            }
            cout << "=======3" << endl;
            vector<Review> oldlist(books);
            if(num > 3)
            {
                books.erase(books.begin()+1, books.begin()+3);
                for (pr=books.begin(); pr != books.end(); ++pr) {
                    ShowReview(*pr);
                }
                cout << "=======4" << endl;

                books.insert(books.begin(), oldlist.begin()+1, oldlist.begin()+2);
                for (pr=books.begin(); pr != books.end(); ++pr) {
                    ShowReview(*pr);
                }
                cout << "=======5" << endl;
            }
            cout << "=======6" << endl;
            books.swap(oldlist);
            for (pr=books.begin(); pr != books.end(); ++pr) {
                ShowReview(*pr);
            }
        }
        else
        {
            cout << "=======7" << endl;
            cout << "nothing" << endl;
        }
    }

    bool FillReview(Review &rr)
    {
        using namespace std;
        cout << "Enter book title:";
        getline(cin, rr.title); // 字符串的输入
    //    cin >> rr.title;
        if(rr.title == "quit")
        {
            return false;
        }
        cout << "Enter book rating:";
        cin >> rr.rating;
        if(!cin)
        {
            return false;
        }

        while(cin.get()!='\n')
        {
            continue;
        }
        return true;

    }

    void ShowReview(Review &rr)
    {
        std::cout << "Title :" << rr.title << ",rating :" << rr.rating << std::endl;
    }

🔚