数组向量
数组向量 (array vector) 是一种特殊的向量,用于存储可变长度的二维数组。
本节将介绍数组向量的创建及其数据的读写。
创建数组向量
API 提供两种方式来创建数组向量。
方法一
static Vector* createArrayVector(VectorSP index, VectorSP value);
index 和 value 的详细说明请参考 arrayVector。
示例代码
VectorSP index = Util::createVector(DT_INT, 0);
int indexData[3]{3, 6, 9};
index->appendInt(indexData, 3);
VectorSP value = Util::createVector(DT_LONG, 0);
long long valueData[9]{1, 2, 3, 1, 2, 3, 1, 2, 3};
value->appendLong(valueData, 9);
VectorSP v2 = Util::createArrayVector(index, value);
std::cout << v2->getString() << std::endl;
//output: [[1,2,3],[1,2,3],[1,2,3]]
方法二
通过指定具体的类型创建
static Vector* createArrayVector(DATA_TYPE type, INDEX size, INDEX capacity = 0, bool fast = true, int extraParam = 0, void *data = NULL, INDEX *pindex = NULL, bool containNull = false);
参数
type:表示元素的类型,如 DT_LONG_ARRAY,DT_INT_ARRAY 等。
size:表示初始大小。
capacity:表示在构造时分配的容量。合理设置容量可以提高数据插入的性能。
fast:该参数为保留参数,目前不起作用。
extraParam:在创建 DECIMAL 类型的 ArrayVector 时使用,用来传入 DECIMAL 的 scale。
data:如果有初始元素,data 用来传入 value 数组的内容。用户不需要主动去释放这段内存,Vector 在析构时会通过
delete[]
自动释放。
pindex: 如果有初始元素,pindex 用来传入 index 数组的内容。用户不需要主动去释放这段内存,Vector
在析构时会通过 delete[]
自动释放。
containNull:若传入 data,则该参数表示 data 中是否包含空值。true 表示包含,默认为 false,表示不包含。
示例代码
int *indexData = new int[3]{3, 6, 9};
long long *valueData = new long long[9]{1, 2, 3, 1, 2, 3, 1, 2, 3};
VectorSP v3 = Util::createArrayVector(DT_LONG_ARRAY, 3, 3, true, 0, valueData, indexData);
std::cout << v3->getString() << std::endl;
// output: [[1,2,3],[1,2,3],[1,2,3]]
添加数据
通过 append 方法来添加数据。将 value 添加到数组向量的末尾,其中 value 可以是向量或者向量数组,方法声明如下:
bool append(const ConstantSP& value);
示例代码
long long data[3]{1, 2, 3};
VectorSP subv1 = Util::createVector(DT_LONG, 0);
subv1->appendLong(data, 3);
v3->append(subv1);
std::cout << v3->getString() << std::endl; //[[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
VectorSP v4 = ConstantSP(v3)->getValue();
v3->append(v4);
std::cout << v3->getString() << std::endl; //[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
读取数据
API 提供两种方式从数组向量中读取数据
方法一
使用 get 方法通过下标取出数据。方法声明如下:
ConstantSP get(INDEX index) const;
示例代码
VectorSP subv2 = v3->get(2);
std::cout << subv2->getString() << std::endl;
// [1,2,3]
此方法会在每次调用时创建一个新数组,涉及额内存分配和释放操作。如果对读取性能有更高要求,建议采用方法二。
方法二
取出 value 和 index 数组,以此来取值。方法声明如下:
ConstantSP getSourceValue();
ConstantSP getSourceIndex();
示例代码
int *indexData = new int[3]{3, 9, 11};
long long *valueData = new long long[11]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
VectorSP v3 = Util::createArrayVector(DT_LONG_ARRAY, 3, 3, true, 0, valueData, indexData);
std::cout << v3->getString() << std::endl;
int maxLength = 10;
std::vector<long long> element(maxLength);
VectorSP value = dynamic_cast<FastArrayVector*>(v3.get())->getSourceValue();
VectorSP index = dynamic_cast<FastArrayVector*>(v3.get())->getSourceIndex();
const long long* valueBuf = value->getLongConst(0, value->size(), nullptr);
const int* indexBuf = index->getIndexConst(0, index->size(), nullptr);
int startIndex = 0;
int length = 0;
for(int i = 0; i < v3->size(); ++i){
length = indexBuf[i] - startIndex;
memcpy(element.data(), valueBuf + startIndex, length * sizeof(long long));
std::cout << "the " << i << " element: ";
for(int j = 0; j < length; ++j) {
std::cout << element[j] << " ";
}
std::cout << std::endl;
startIndex = indexBuf[i];
}