C++学习之vector容器笔记

本文详细探讨了C++中STL向量容器的使用方法与技巧,包括构造、迭代操作、插入与删除元素等核心功能,并通过实例展示了如何自定义释放函数来管理动态分配的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class Student
{
public :
    Student(){cout << "Student() is dead..." <<endl;}
    ~Student(){cout << "~Student() is here..." << endl;}
    Sutdent(const Student &stu)
    {
        m_strName = stu.m_strName;
        m_fScore = stu.m_fScore;
        cout << "Student(const Student &) is here... " << endl;
    }
    Student(string name,float score)
    {
        m_strName = name;
        m_fScore = score;
        cout << "Student(aguments)..." <<endl;
    }
/**
    friend void print(const vector<Student>&vec)
    {
        vector<Student>::const_iterator iter;
        iter = vec.begin();
        for(;iter!=vec.end();iter++)
        {
            cout << *iter->stu.m_stuName << endl;
        }
    }
**/
private:
    string m_strName;
    float m_fScore;

};

//typedef vector<Student> VECSTU;
typedef vector<Student*> VECSTU;

/**自定义释放函数**/
void freeVec(VECSTU &vecStu)
{
    VECSTU::iterator iter = vecStu.begin();
    for (; iter != vecStu.end(); iter++)
    {
        delete (*iter);
    }
}

void print(const vector<int> &vec)
{
    vector<int>::const_iterator iter = vec.begin();//迭代器

    for(;iter !=vec.end();iter++)
    {
        cout << *iter <<' ';
    }
    cout << endl;
}

typedef vector<int> VECINT;



int main(void)
{
#if 0
    vector<int> vec_int;

    for(int i =0;i<10;i++)
    {
         //push_back:将数据放到容器里的最后
        vec_int.push_back(i+10);
        //capacity:获得容器实际存储容量的大小
        cout << vec_int.capacity() << endl;
    }

    //size:获得容器元素的个数
    for(int i=0;i<vec_int.size();i++)
    {
        //当容器中存在存储空间才可以使用下标访问数据
        //注意不要越界,没有做越界检查
        //cout<<vec_int[i]<<' ' << endl;
        cout << vec_int.at(i) << ' ';
    }
    cout << endl;

    /**
    verctor<int>是声明向量容器;
    例如 verctor<int> v,就是创建了一个名字叫v的向量容器。
    vector<int>::iterator是定义向量迭代器
    例如,vector<int>::iterator it 就可以
    for(it=v.begin();it!=v.end();it++)
    cout<<*it<<endl;
    就把里面的内容都输出了
    **/
    vector<int>::iterator iter;

    iter = vec_int.begin();

    for(;iter!=vec_int.end();iter++)
    {
        cout << *iter << ' ';
    }
    cout << endl;
#endif

#if 0
    int iaData[6] = {11,32,15,17,26,19};
    //vector<int> vec(iaData,iaData + 6);//从数组的第一个值到数组第六个值
    vector<int> vec(10,999);//插入10个数,每个都是999

    for(int i = 0;i < vec.size();i++)
    {
        cout << vec[i] << ' ';
    }
   cout << endl;

   cout << vec.capacity() << endl;

   for(int i =0;i<vec.size();i++)
   {
    cout << vec[i] << ' ';
   }
   cout << endl;

   cout << "11111111111111111111111111111111111111" <<endl;

   vec.assign(2,888);
   cout << vec.capacity() << endl;


   for(int i = 0;i<vec.size();i++)
   {
    cout << vec[i] << ' ';
    }
   cout << endl;

   cout << "22222222222222222222222222222222222222" << endl;

   cout << vec.max_size() << endl;

   if(vec.empty())
   {
    cout << "vector is empty" << endl;
   }else
   {
   cout << "vec id not empty"<<endl;
   }

   vec.reserve(1024);
   cout << vec.capacity() <<endl;

   for(int i = 0;i<vec.size();i++)
   {
    cout << vec[i] <<' ';
   }
   cout << endl;
   vec.push_back(111);

   printf("3333333333333333333333333333333333\n");
   cout << vec.back() << ' ' << vec.front() <<endl;
#endif


#if 0
   //vector<int> vec_int;
    VECINT vec_int;

    for(int i =0;i < 10;i++)
    {
        vec_int.push_back(i+10);
    }

    vector<int>::iterator iter;
    iter = vec_int.begin();

    cout << *iter << endl;

    for(;iter!=vec_int.end();iter++)
    {
       cout << *iter << ' ';
    }
    cout << endl;

    cout << "first function test like above" <<endl;

    iter = vec_int.begin();
    for(;iter!=vec_int.end();iter++)
    {
        *iter +=10;
    }

    iter = vec_int.begin();
    for(;iter !=vec_int.end();iter++)
    {
        cout << *iter << ' ';
    }
    cout << endl;

    cout << "second function test like above" << endl;

    vector<int>::const_iterator const_iter;
    const_iter = vec_int.begin();
    cout << *const_iter << endl;
    //*const_iter = 666;/error

    for(;const_iter != vec_int.end();const_iter++)
    {
        cout << *const_iter << ' ';
    }
    cout << endl;

    cout << "third function test this above" << endl;

    iter = vec_int.begin();
    vec_int.insert(iter,698);
    iter = vec_int.begin();
    cout << *iter << endl;

    cout << "fouth function test this above" <<endl;


    iter++;
    iter++;
    vec_int.insert(iter,3,899);//插入三个数
    iter = vec_int.begin();
    for(;iter != vec_int.end();iter++)
    {
        cout << *iter << ' ';
    }
    cout << endl;
    cout << "ffith function test this above" <<endl;

    int iaData[] = {1,2,3,4,5,6,7,8,9};
    iter = vec_int.begin();
    iter++;
    vec_int.insert(iter,iaData,iaData + 8);//插入数组
    iter = vec_int.begin();

    for(;iter != vec_int.end();iter++)
    {
        cout << *iter << ' ';
    }
    cout << endl;

    cout << "sixth function test is above" <<endl;

    cout << vec_int.capacity() <<endl;
    iter = vec_int.begin();

   // iter = vec_int.begin();
   /** for(;iter != vec_int.end();iter++)
    {
        cout << *iter << ' ';
    }
    cout << endl;
**/
    //iter = vec_int.end();

    vec_int.insert(iter,2,88);
    for(;iter !=vec_int.end();iter++)
    {
        if(0 != *iter %2)
        {
            //增删数据后,所有的迭代器均失效,需要重新赋值
            //erase:返回一个迭代器,
            //该迭代器指向下一个元素或者end()
             //只是将元素删除,并不会对存储空间产生影响
            //erase()函数的功能是用来删除容器中的元素。
            /**
函数原型:
iterator erase(iterator where);
iterator erase(iterator first,iterator last);
basic_string& erase(size_type p0=0,size_type n=np);
删除某个容器里的某个元素:c.erase(T);
链表容器以list为例,执行container.erase(it)。
list<int>::iterator it;
for (it = lt.begin(); it != lt.end(); ) {
if (*it % 2 == 0)
lt.erase(it++);
else
++it;
}
            **/
             iter = vec_int.erase(iter);
        }else
        {
            iter++;
        }
    }

    cout << vec_int.capacity() <<endl;
    iter = vec_int.begin();
    for(;iter != vec_int.end();iter++)
    {
        cout << *iter << ' ';
    }
    cout << endl;
    print(vec_int);

    cout << "this test is below"<< endl;
        VECINT::iterator iter1 = vec_int.begin();
        VECINT::iterator iter2 = vec_int.begin();
        iter2++;
        iter2++;
        vec_int.erase(iter1, iter2); //[iter1, iter2);
        print(vec_int);

#endif
#if 0
    VECSTU stuVec;
    Student stu("zhangsan",99);

    for(int i=0;i<5;i++)
    {
        stuVec.push_back(stu);
    }
#endif


    VECSTU stuVec;

        Student *pStu = NULL;

        cout << "----------------------------" << endl;

        for (int i = 0; i < 5; i++)
        {
            pStu = new Student("zhangsan", i + 100);
            stuVec.push_back(pStu);
        }

        freeVec(stuVec);


    // cout << stuVec.at(0).m_strName <<endl;


    cout << "Hello World!" << endl;
    return 0;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值