C++百日训练第二天

1.问题:熟悉各种向量的拼接方法,并进行对比分析,分析性能差异。

// vector is a kind  of data structure that is usually used in c++ ;it can change its shape
// C++中vector是一种常见的数据结构,代表了一个可动态改变大小的数组,vector进行拼接形成新的vector是常见的操作,不同拼接方法性能不同,下面具体分析:
// ************************************************************************************************************************************************************************************
// tip1:C++ <STL(standard Template Library)> "insert" member function
/* C++ STL中vector提供了insert成员函数,可以用来在指定的位置前插入另一个容器的全部或者部分元素,这是拼接两个vector的一种直观方法。
使用insert函数进行拼接时,如果vector需要扩展容量,可能导致内存重新分配和数据复制,从而影响性能。不过大多数现代C++实现中,vector的内存分配策略
已经相当优化,对于不是极端频繁的操作,这种性能影响通常是忽略不计的。 */
#include <iostream>
#include <vector>

int main(){
    std::vector<int> vec1={1,2,3};
    std::vector<int> vec2={4,5,6};
    // 在vec1末尾插入vec2的所有元素
    vec1.insert(vec1.end(),vec2.begin(),vec2.end());
    // 输出结果
    for (int num:vec1){
        std::cout<<num<<' ';
    }
    std::cout << std::endl;
    return 0;
}
// ************************************************************************************************************************************************************************************
// 使用push_back和迭代器:遍历第二个vector,并使用push_back函数将其元素逐个添加到第一个vector的末尾
#include <iostream>
#include <vector>
int main(){
    std::vector<int> vec1={1,2,3};
    std::vector<int> vec2={43,54,60};
    // 遍历vec2,将每个元素添加到vec1的末尾
    for (auto it=vec2.begin();it !=vec2.end();++it){
        vec1.push_back(*it);
    }
    // 输出结果
    for (int num:vec1){
        std::cout<<num<<' ';
    }
    std::cout<<std::endl;
    return 0;
}
/* 使用push_back进行拼接时,如果vector的当前容量不足以容纳新元素,也会导致内存重新分配,不过与insert成员函数方法相比,push_back方法通常会有更少的内存复制操作,因为每次只添加一个元素。*/
// ************************************************************************************************************************************************************************************
// 采用reserve优化性能:在拼接vector之前,可使用reserve函数预分配足够的内存空间,以避免在拼接过程中发生内存重新分配
#include<iostream>
#include<vector>
int main(){
    std::vector<int> vec1={1,2,3};
    std::vector<int> vec2={67,68,69};
    // reserve函数预分配vector内存
    vec1.reserve(vec1.size()+vec2.size());
    // push_back方法拼接
    for (auto it=vec2.begin();it!=vec2.end();++it){
        vec1.push_back(*it);
    }
    // 输出结果
    for (int num:vec1){
        std::cout<<num<<' ';
    }
    std::cout<<std::endl;
    return 0;
}
/* 通过reserve预分配内存,可以确保在拼接过程中不会发生内存重新分配,从而提高性能。这是一种推荐做法,尤其处理大量数据时。 */
// ************************************************************************************************************************************************************************************
// 使用C++11的std::vector::emplace_back:在C++11引入了emplace_back成员函数,它允许在vector的末尾直接构造元素,而不是先构造元素再复制到vector中,减少了不必要的元素复制和移动操作,提高性能。
#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vec1 = {11,22,33};
    std::vector<int> vec2 = {44,55,66};
    vec1.reserve(vec1.size() + vec2.size());
    // emplace_back拼接
    for (auto it = vec2.begin(); it != vec2.end(); ++it)
    {
        vec1.emplace_back(*it);
    }
    // 输出结果
    for (int num : vec1)
    {
        std::cout << num << ' ';
    }
    std::cout << std::endl;
    return 0;
}
/* emplace_back可以减少不必要的元素的复制或移动,因此在拼接包含复杂对象的vector时使用emplace_back可能带来显著的性能提升。 */
// ************************************************************************************************************************************************************************************
/* 总结:在C++拼接两个vector有很多种方法,包括使用insert成员函数,push_back和迭代器,预分配内存以及使用C++的emplace_back。在实际开发中,应该根据具体需求以及上下文环境选择合适方法,
对于性能敏感的应用,建议使用reserve预分配内存,使用emplace_back减少不必要的元素复制或移动。 */

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值