[C++ API总结]Vector

一维vector 的创建和初始化

  • 常见用法
vector<int> vec1; // 是空的整形vector,我们没有给他添加任何元素。
vector<float> vec2(3); //初始化了一个有3个元素的vector,由于并没有指定初始 值,将会使用编译器默认的初始值。
vector<char> vec3(3,'a'); //初始化了含有3个a的字符vector
vector<char> vec4(vec3); //通过拷贝vec3中的元素初始化vec4,它们的元素会一模一样。
std::vector<std::vector<int>> a2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
  • 扩容初始化
    producePerid.resize(perids.size(), 0); // 扩容初始化

vector的添加

vec1.push_back(1);
v.insert(v.begin(), 10);  //插入一个元素
v.insert(v.begin(), 3, 10); //在开始插入10,10,10

vector的遍历

//利用下标  
for (vector<int>::size_type ix = 0; ix != v.size(); ix ++){
printf("%d\t", v[ix]);
}
printf("\n");

//利用迭代器
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); it ++){
printf("%d\t", *it);
}

vector的删除

vector 删除元素的几种方法

  • 1、利用成员函数pop_back()可以删除最后一个元素;
  • 2、利用成员函数erase()
遍历删除全部元素
vector `<int>`::iterator it;
for (it = vecnum.begin(); it != vecnum.end(); )
{
    //注意使用erase()方法时,迭代不要随意的++
    it = vecnum.erase(it); // 注意这里一定要将it设为返回值
}
删除特定元素
vector `<int>`::iterator it;
for (it = vecnum.begin(); it != vecnum.end(); )
{
    //注意使用erase()方法时,迭代不要随意的++
    if(*it == 1) {
        it = vecnum.erase(it); // 注意这里一定要将it设为返回值
    } else {
    	it++;
    }

}
erase()可以删除由一个iterator指出的元素;返回的迭代器指向被删除元素后的位置,
erase在每次操作时,迭代器指针会整体前移1,`auto iter = data.erase(std::begin(data)+1,std::begin(data)+3);`
它的返回值是 std::begin(data)+1 其实也就是原删除前的  std::begin(data)+4 ;
如果删除了最后一个元素,它就是 std::end(data)。
[erase在每次操作时,迭代器指针会整体前移1,就是每次都会移动全部数据](https://so.csdn.net/so/search?q=vector&spm=1001.2101.3001.7020),
所以不适合做频繁删除的容器
  • 3、通过STL中的算法库函数remove()删除指定的元素,
    remove() 算法由定义在 algorithm 头文件中的模板生成,它可以删除匹配特定值的一段元素。例如 auto iter = std::remove(std::begin(words), std::end(words), "none"); 表示删除,words中的none字符串,并将后面的字符前移填满整个字符串,最后返回指向字符串末尾的迭代器,注意这里的末尾不是字符串真正的末尾,是压缩之后的字符串的末尾。http://c.biancheng.net/view/429.html

  • 4、swap,清空了容器,且释放了内存。 示例:vector().swap(vecnum);

  • 5、clear(),清空元素,但不回收空间

  • 6、resize可以重新定义实际数据量size,但不会改变容量 capacity,具体参看 resize的的不同,因此swap也可以用来清空数组,具体参看 resize的的不同,因此swap也可以用来清空数组,具体参看

判断是否相等

if (vec1 == vec2)

排序

1、默认升序

sort(num.begin(),num.end());  // 需要包含头文件** **# **include** `<algorithm>`**
sort(name.rbegin(),name.rend()); // 同理 简单降序排序

2 lambda函数

写法1:匿名函数
vector<int>vec{5,4,6,9,8,1};
std::sort(s.begin(), s.end(), [](int a, int b) {
    return a > b;
});

写法2:lamda函数
记忆点:bool返回 + 引用& + 参数的类型是元素
vector<vector<int> >a(6);
 bool cmp(vector<int>&a,vector<int>&b){
     if(a[0]!=b[0]) return a[0]<b[0];
     else return a[1]>b[1];
 }
  sort(num.begin(),num.end(), cmp)

2、操作符重载进行排序

注意这里只有一个入参,因为操作符是内置函数,其次这里是类的成员函数,再其次这里是操作符+括号的形式
记忆点:返回bool + 函数名为 Student::operator> + 单const 对象&参数

bool Student::operator>(const Student& stu)
{
    if(this->age > stu.age)
        return true;
    return false;
}

3、函数对象进行排序

深浅拷贝

  • 浅拷贝:
    vector &nums2 = nums; 这是一个浅拷贝 ,类似为 nums取了一个别名

  • 深拷贝的方法如下:
    一、初始化构造时拷贝 或 赋值运算符 --深复制 创建了一个新对象,影分身
    vectortem(list); //这种拷贝,相当于复制了一份数据,list中的数据不变。
    vector &nums2 = nums; 这是一个浅拷贝 有取地址符号
    nums2 = nums; // 这是一个深拷贝

    二、assign。换汤不换碗
    temlist.assign(list.begin(), list.end()); 复制了一份数据,list中的数据不变
    outArray.assign(5, 0);//5个0,清空原数据={0,0,0,0,0,}

    三、swap 数据和空间完全互换 – 深复制,原数据变了 交换角色和空间
    vector<int> temlist;
    temlist.swap(list);
    将list中数据全部移到temlist中,此时list中为空了

    四、insert
    temlist.insert(temlist.end(), temlist2.begin(), temlist2.end());
    将temlist2中的数据,全部插入到temlist的末尾。相当于复制了一份数据。

多维向量的创建和初始化

多维向量初始化:
记忆点:
左边的不变 + 然后就是是()的递归展开 + 变量名只有一个
三级定义 变量名(num1, 二级定义(num, 一级定义(num, val)))

vector<int> array(n);
vector<vector<int>> array(m, vector<int>(n));//定义m行n列二维数组,如 vector<vector<int>> test(4,vector<int>(20));
vector<vector<int>> vec(m, vector<int>(n, 0)); // 二维数组的初始化
vector<vector<vector<int>>> vec(n1, vector<vector<int>>(n2, vector<int>(n3, 0))); // 三维数组的初始化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值