我在内存中有一个00 00 00 00 00 00 00 00 00 33 2E 31 34 99 99 99 .........3.14™™™
缓冲区,其中包含一个特定偏移量的数字,例如
std::copy()
我知道结束并开始偏移以读取double / float值,但是现在我将std::string
的相关部分复制到std::stod
然后调用{{1}} }。我的问题是:我怎样才能让它更快?
必须有办法避免复制..例如:我可以将流指向另一个缓冲区中的特定偏移量吗?或类似的事情
答案 0 :(得分:0)
如果您知道偏移,那么只需:
vector<char> data;
// ... snip ...
char *endp = null;
double result = strtod(&data[offset],&endp);
注意:这假设数字后跟非数字字符(或字符串结尾)。
答案 1 :(得分:0)
如果数字是分隔的,那么直接在缓冲区上使用strtod
就像Let_Me_Be建议的那样有效。但是,由于数字未分隔,因此您无法直接使用strtod
。
如果缓冲区为零(或eof)终止,则可以通过在数字后添加终结符来简单地修改它,然后恢复原始字符,如bolov建议的那样。由于结束偏移是数字的一部分,因此始终至少有终结符,因此offset_end
不会溢出。以下代码假定offset_end
是最后一个字符的一个。如果它是最后一个字符,那么只需使用+ 1
。
auto original = data[offset_end];
data[offset_end] = '\0';
auto result = strtod(&data[offset_start], nullptr);
data[offset_end] = original;
即使如果缓冲区没有终止,你仍然可以这样做,但只有当数字不在最后时才会这样做。如果是,或者您不知道缓冲区的结束位置,或者缓冲区是const
,那么您当前的解决方案就像它获得的效率一样高。