自适应模板Array

这是一个自适应大小的Array的类型(不重复节点)
功能:
加入节点
删除节点
返回缓冲区
返回缓冲需大小


类定义与实现:

  1. #ifndef __MYVECTOR_H__
  2. #define __MYVECTOR_H__
  3. #include "memory.h"
  4. //加入一个不重复的节点到vector中,自动更新内容大小
  5. template <class T> class MyVector{
  6. public:
  7.     void Add(T t)
  8.     {
  9.         for(int i=0;i<_num;i++)    if(_pBuffer[i] == t) return;
  10.         if(_num+1>_size)
  11.         {
  12.             T *p = new T[_size*2];
  13.             memcpy(p,_pBuffer,sizeof(T)*_size);
  14.             delete[] _pBuffer;
  15.             _pBuffer = p;
  16.             _size = 2*_size;
  17.         }
  18.         _pBuffer[_num] = t;
  19.         _num++;
  20.     }
  21.    
  22.     void Delete(T t)
  23.     {
  24.         for(int i=0;i<_num;i++)   
  25.         {
  26.             if(_pBuffer[i] == t)
  27.             {               
  28.                 for(int j=i;j<_num;j++)
  29.                     _pBuffer[j]=_pBuffer[j+1];
  30.                 _num--;
  31.             }
  32.         }
  33.     }
  34.     T* GetBuffer(){return _pBuffer;}
  35.     int Count(){return _num;}
  36.     int BufferSize(){return _size;}
  37. public:
  38.     MyVector(int sz = 1):_num(0) {_size = sz; _pBuffer = new T[_size];}
  39.     ~MyVector(){delete[] _pBuffer;}
  40. private:
  41.     int _num;
  42.     int _size;
  43.     T* _pBuffer;
  44. };
  45. //加入一个不重复的节点与其相对应的节点到vector中,自动更新内容大小
  46. template <class T,class T2> class MyVector2{
  47. public:
  48.     void Add(T t,T2 t2)
  49.     {
  50.         for(int i=0;i<_num;i++)    if(_pBuffer[i] == t) return;
  51.         if(_num+1>_size)
  52.         {
  53.             T *p = new T[_size*2];
  54.             T2 *p2 = new T2[_size*2];
  55.             memcpy(p,_pBuffer,sizeof(T)*_size);
  56.             memcpy(p2,_pBuffer2,sizeof(T2)*_size);
  57.             delete[] _pBuffer;
  58.             delete[] _pBuffer2;
  59.             _pBuffer = p;
  60.             _pBuffer2 = p2;
  61.             _size = 2*_size;
  62.         }
  63.         _pBuffer[_num] = t;
  64.         _pBuffer2[_num] = t2;
  65.         _num++;
  66.     }
  67.    
  68.     void Delete(T t)
  69.     {
  70.         for(int i=0;i<_num;i++)   
  71.         {
  72.             if(_pBuffer[i] == t)
  73.             {               
  74.                 for(int j=i;j<_num;j++)
  75.                 {
  76.                     _pBuffer[j]=_pBuffer[j+1];
  77.                     _pBuffer2[j]=_pBuffer2[j+1];
  78.                 }
  79.                 _num--;
  80.             }
  81.         }
  82.     }
  83.     T* GetBuffer(){return _pBuffer;}
  84.     T2* GetBuffer2(){return _pBuffer2;}
  85.     int Count(){return _num;}
  86.     int BufferSize(){return _size;}
  87. public:
  88.     MyVector2(int sz = 1):_num(0) {_size = sz; _pBuffer = new T[_size];_pBuffer2 = new T2[_size];}
  89.     ~MyVector2(){delete[] _pBuffer;delete[] _pBuffer2;}
  90. private:
  91.     int _num;
  92.     int _size;
  93.     T* _pBuffer;
  94.     T2* _pBuffer2;
  95. };
  96. #endif



使用方法:
  1. #include "myvector.h"
  2. void printvect(MyVector<int>& v)
  3. {
  4.     int num = v.Count();
  5.     int sz = v.BufferSize();
  6.     int* pbuffer = v.GetBuffer();
  7.     printf("缓冲:%d个|实际:%d个|",sz,num);
  8.     for(int i=0;i<num;i++)
  9.     {
  10.         printf("%d ",pbuffer[i]);
  11.     }
  12.     printf("/n");
  13. }
  14. void printvect2(MyVector2<int,float>& v)
  15. {
  16.     int num = v.Count();
  17.     int sz = v.BufferSize();
  18.     int* pbuffer1 = v.GetBuffer();
  19.     float* pbuffer2 = v.GetBuffer2();
  20.     printf("缓冲:%d个|实际:%d个|",sz,num);
  21.     for(int i=0;i<num;i++)
  22.     {
  23.         printf("%d:%f ",pbuffer1[i],pbuffer2[i]);
  24.     }
  25.     printf("/n");
  26. }
  27. int main(int argc, char* argv[])
  28. {
  29.     MyVector2<int,float> vec;
  30.     printvect2(vec);
  31.     vec.Add(1,0.1);
  32.     printvect2(vec);
  33.     vec.Add(2,0.2);
  34.     printvect2(vec);
  35.     vec.Add(3,0.3);
  36.     printvect2(vec);
  37.     vec.Add(4,0.4);
  38.     printvect2(vec);
  39.     vec.Delete(5);
  40.     printvect2(vec);
  41.     vec.Delete(3);
  42.     printvect2(vec);
  43.     vec.Add(4,0.4);
  44.     printvect2(vec);
  45.     vec.Add(7,0.7);
  46.     printvect2(vec);
  47.     vec.Add(8,0.88);
  48.     printvect2(vec);
  49.     vec.Add(9,0.99);
  50.     printvect2(vec);
  51.     printf("Hello World!/n");
  52.     return 0;
  53. }


输出截图:
### 解决方案 为了实现 `el-carousel` 组件的高度自适应,可以通过动态计算高度并绑定到组件的 `height` 属性来完成。以下是几种常见的解决方案: #### 方法一:通过 CSS 单位设置固定比例高度 可以利用现代浏览器支持的视口单位(如 `vh`, `vw`),直接在模板中定义 `height` 的值。 ```html <el-carousel class="carousel-container" loop height="25dvw" :interval="4000" indicator-position="outside"> <el-carousel-item v-for="item in carouselsList" :key="item.id"> <img class="img-container" :src="item.path" :alt="item.name"/> </el-carousel-item> </el-carousel> ``` 此方法简单易用,适用于内容高度相对固定的场景[^1]。然而,如果图片或其他子元素的高度不一致,则可能导致布局错乱。 --- #### 方法二:基于事件监听动态调整高度 当轮播项的内容高度可能发生变化时,可通过 JavaScript 动态获取当前显示内容的实际高度,并将其赋值给父容器的 `height` 属性。 ```html <el-carousel ref="bannerCarousel" :interval="5000" arrow="always" @change="calcDivHeight" :height="carouselHeight + 'px'" :autoplay="bannerAutoPlay" > <el-carousel-item v-for="(item, index) in personCarouse" :key="index" :style="{ height: carouselHeight + 'px', overflow: 'hidden' }" > <div @click="goTo(item.webUrl)" :ref="'banner-div-' + index" style="background: transparent;" > <el-image style="width: 100%;" :src="item.imgUrl" fit="fill" :ref="'banner-img-' + index" @load="initDivHeight(index)" /> </div> </el-carousel-item> </el-carousel> ``` 在此方法中,`@load` 和 `@change` 事件分别用于初始化和切换时重新计算高度[^2]。具体逻辑如下: - **`@load`**: 当每张图片加载完成后触发,调用函数测量其真实尺寸。 - **`@change`**: 轮播切换时更新目标区域的高度。 配合 Vue 数据绑定机制,能够灵活应对多种复杂情况。 --- #### 方法三:全屏模式下的响应式设计 对于需要完全适配屏幕大小的情况,可采用以下方式: ```html <div class="swiper"> <el-carousel indicator-position="none" arrow="always" :height="bannerHeight + 'px'" > <el-carousel-item v-for="(item, index) in swiperlist" :key="index"> <a :href="item.bannerTargetUrl" :target="targetUrl(item.targetType)"> <img :src="item.bannerUrl" ref="image" @load="imageLoaded"/> </a> </el-carousel-item> </el-carousel> </div> ``` 同时,在脚本部分加入窗口缩放监听器以实时同步 banner 高度变化[^3]: ```javascript export default { data() { return { bannerHeight: window.innerHeight * 0.8 // 初始占屏幕高度的80% }; }, methods: { imageLoaded() { this.$nextTick(() => { const images = Array.from(this.$refs.image); let maxHeight = Math.max(...images.map(img => img.offsetHeight)); this.bannerHeight = maxHeight; }); } }, mounted() { window.addEventListener('resize', () => { this.bannerHeight = window.innerHeight * 0.8; }); }, beforeDestroy() { window.removeEventListener('resize'); } }; ``` 这种方法特别适合制作大屏展示类应用,能有效提升用户体验。 --- ### 总结 以上三种策略各有优劣: - 如果项目对性能要求较高且内容结构稳定,推荐使用 **CSS 单位法**; - 对于动态数据驱动或者交互频繁的应用场景,建议优先考虑 **JavaScript 动态调整法**; - 若追求极致视觉效果则可以选择 **全屏响应式设计** 方案。 最终选择应依据实际业务需求权衡利弊决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值