gpt4 book ai didi

c++ - 修改 std::vector 的底层数据结构不会改变它的大小

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:06 31 4
gpt4 key购买 nike

我在类中使用 std::vector 桥接 JNI 入口点和新的 C++ 库。

因为有很多 JNI 调用涉及 jbyteArray,所以我编写了简单的转换函数:

std::vector<uint8_t> Jni::Types::vectorForJarray(jbyteArray a) {
auto env = Jni::getEnv();
auto len = env->GetArrayLength(a);
std::vector<uint8_t> result;
result.reserve(static_cast<unsigned int>(len));
env->GetByteArrayRegion (a, 0, len, reinterpret_cast<jbyte*>(result.data()));
return result;
}

jbyteArray Jni::Types::JarrayForVector(std::vector<uint8_t> v) {
auto env = Jni::getEnv();
auto array = env->NewByteArray(v.size());
if (env->GetArrayLength(array) != v.size()) {
env->DeleteLocalRef(array);
array = env->NewByteArray(v.size());
}
void* temp = env->GetPrimitiveArrayCritical(array, 0);
memcpy(temp, v.data(), v.size());
env->ReleasePrimitiveArrayCritical(array, temp, 0);
return array;
}

问题

如果我通过 data() 方法修改 vector,它的长度(通过 size() 获得)将保持为 0。您对如何使 vector 显示正确的大小有任何想法吗?我会注意到,此函数被多次调用,因此性能非常重要。

最佳答案

当然 vector 的大小不会增加。想一想。

您正在使用 GetByteArrayRegion 将数据直接复制到 vector 的底层缓冲区。您希望它的“大小”成员如何变化。

为了解决这个问题,我会在创建 vector 时使用它来设置 vector 的大小 fill constructor

std::vector<uint8_t> result(static_cast<unsigned int>(len), 0);

这将创建 vector 并用 len 个元素填充它,每个元素都是第二个参数的拷贝,在本例中为 0。

现在 vector 的大小是您想要的大小,因此使用 GetByteArrayRegion 将数据直接复制到它应该没问题。

关于c++ - 修改 std::vector 的底层数据结构不会改变它的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33300033/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com