gpt4 book ai didi

c++ - 如何有效地将大 std::string 的一部分转换为 float?

转载 作者:太空宇宙 更新时间:2023-11-04 15:29:18 25 4
gpt4 key购买 nike

void OBJLoader::load_vec(const char* line_prefix) {
size_t jump = 0;
size_t strpos = 0;
if (line_prefix == "v ") {
while ((strpos = buffer.find(line_prefix, strpos)) != string::npos) {
strpos++;
vcoord_vec.emplace_back(stof(&buffer.at(strpos), &jump));
strpos += jump;
vcoord_vec.emplace_back(stof(&buffer.at(strpos), &jump));
strpos += jump;
vcoord_vec.emplace_back(stof(&buffer.at(strpos), &jump));
strpos += jump;
}
return;
}
//(...)

这是我用来将 buffer 字符串中的文本转换为 float 并将其放入 vector 中的代码。字符串本身的重要部分具有这样的结构:

v -0.893339 0.784809 0.891470
v -0.893339 -0.784809 0.891470
v -0.692655 -0.634043 0.017402
v 0.692655 0.586786 -0.017402
v -0.710057 0.651445 0.000000
v 0.710057 -0.604188 0.000000
v 0.017402 -0.571364 -0.674429
v -0.017402 0.618621 0.674429
v 0.000000 -0.636023 0.691831

使用 vcoord_vec.emplace_back(stof(&buffer.at(strpos), &jump)) 将单个值加载到 vector 中大约需要 200 毫秒,同时:

void OBJLoader::load_vec(const char* line_prefix) {
char* cbuffer = const_cast<char*>(buffer.c_str());
if (line_prefix == "v ") {
while (cbuffer = strstr(cbuffer, line_prefix)) {
cbuffer++;
vcoord_vec.emplace_back(strtof(cbuffer, &cbuffer));
vcoord_vec.emplace_back(strtof(cbuffer, &cbuffer));
vcoord_vec.emplace_back(strtof(cbuffer, &cbuffer));
}
return;
}
//(...)

在 489 毫秒内加载了 4 718 598 个。以相当的效率将已知索引处的字符串的一部分转换为任何类型的数字的“C++ 方式”是什么?

最佳答案

您使用的 std::stof 有误。当它期望 const std::string& 时,您传递给它的是 char*

其结果是在每次调用 std::stof 时从 char* 隐式转换为 std::string,复制buffer 的全部内容,从 strpos 开始到它的空终止符,进入由函数参数转换创建的临时空间。

首选 std::from_chars 如果可用 (C++17),否则我建议坚持使用 std::strtof 进行转换(这并不意味着你必须继续使用 strstr)。 std::stof 被指定为调用 std::strtof

关于c++ - 如何有效地将大 std::string 的一部分转换为 float?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775549/

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