(27条消息) vector<char>太慢,自己造一个CharVector_char vector_飞鸟真人的博客-CSDN博客
Sat Mar 11 2023 03:18:45 GMT+0000 (Coordinated Universal Time)
Saved by
@leawoliu
#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <assert.h>
#include <iostream>
using namespace std;
class CharVector
{
public:
CharVector(): base_ptr(nullptr), len(0), cap(0)
{
reserve(64);
}
CharVector(size_t n) : base_ptr(nullptr), len(0), cap(0)
{
reserve(n);
}
~CharVector()
{
if (base_ptr)
free(base_ptr);
}
char * data() { return base_ptr; }
size_t size() { return len; }
size_t capacity() { return cap; }
bool push_back(char ch)
{
if (len < cap)
{
base_ptr[len] = ch;
len++;
return true;
}
else
{
size_t sz = cap;
if (cap > 10 * 1024 * 1024) // 10MB
{
sz = cap + 1024 * 1024;
}
else
{
sz = cap * 2;
}
bool ret = reserve(sz);
if (ret == false)
return false;
base_ptr[len] = ch;
len++;
return true;
}
}
void clear() { len = 0; }
bool reserve(size_t n) {
bool ret = allocMem(n);
//cout <<" reserve : "<< size() << "," << capacity() << endl;
return ret;
}
private:
inline bool allocMem(size_t n)
{
if (base_ptr == nullptr)
{
base_ptr = (char *)malloc(n);
if (base_ptr == nullptr)
return false;
cap = n;
return true;
}
if (n > cap)
{
void *new_ptr = realloc(base_ptr, n);
if (new_ptr == nullptr)
{
new_ptr = malloc(n);
if (new_ptr == nullptr)
return false;
memcpy(new_ptr, base_ptr, len);
cap = n;
free(base_ptr);
base_ptr = (char *)new_ptr;
return true;
}
else
{
cap = n;
if (base_ptr != new_ptr) //
{
//must not call free(base_ptr), because realloc has done!!!
base_ptr = (char *)new_ptr;
}
return true;
}
}
// n < cap, don't do anything
return true;
}
private:
char * base_ptr;
size_t len;
size_t cap;
};
content_copyCOPY
https://blog.csdn.net/robinfoxnan/article/details/118760091?utm_medium
Comments