簡體   English   中英

C++:將浮點數向量轉換為 char*

[英]C++: convert vector of floats to char*

如何將浮點數向量轉換為 char*?

我在std::vector<float> id_list存儲了一組浮點數:

0,
0,
0,
0,
0,
1.77636e-15,
2.35099e-38,
-7.10543e-15,
3.06107e-38,
....

並使用此代碼進行轉換:

char *ptr = (char*)&id_list[0];
std::string dump_string(ptr, id_list.size() * sizeof(float));

但是dump_string.c_str()返回空,盡管我的向量中存儲了一些值。 我期望將所有值連接成一個長字符串,即:

0,0,0,0,0,1.77636e-15,2.35099e-38,-7.10543e-15,3.06107e-38........

我期望將所有值連接成一個長字符串,即:

0,0,0,0,0,1.77636e-15,2.35099e-38,-7.10543e-15,3.06107e-38........

您正在創建一個std::string ,它只保存float組的原始字節的副本。 因此,如果任何字節碰巧包含 0 的數值(如您的示例中的情況),則如果您嘗試將std::string視為以空字符結尾的 C string ,則會得到截斷的結果。

如果要將浮點值實際轉換為人類可讀的字符串,則需要單獨格式化這些值,例如使用std::ostringstreamstd::to_string() ,例如:

std::ostringstream oss;
if (!id_list.empty()) {
    oss << id_list[0];
    for(size_t i = 1; i < id_list.size(); ++i) {
        oss << "," << id_list[i];
    }
}
std::string dump_string = oss.str();
std::string dump_string;
if (!id_list.empty()) {
    dump_string += std::to_string(id_list[0]);
    for(size_t i = 1; i < id_list.size(); ++i) {
        dump_string += ',';
        dump_string += std::to_string(id_list[i]);
    }
}

. 我期望將所有值連接成一個長字符串,即:

你可以寫一個小函數來做到這一點。

例子:

#include <iostream>
#include <iterator> // std::advance
#include <string>
#include <sstream>  // std::stringstream
#include <vector>

// a function taking two iterators and streaming the content to a stringstream
// then returning a `std::string` using `stringstream::str()`
template<typename Begin, typename End = Begin>
std::string join(Begin begin, End end) {
    std::stringstream retval;
    if(begin != end) {
        retval << *begin;
        for(std::advance(begin, 1); begin != end; std::advance(begin, 1)) {
            retval << ',' << *begin;
        }
    }
    return retval.str();
}

int main()
{
    std::vector<float> id_list {
        0,
        0,
        0,
        0,
        0,
        1.77636e-15,
        2.35099e-38,
        -7.10543e-15,
        3.06107e-38,
    };
    std::cout << join(id_list.begin(), id_list.end());
}

輸出:

0,0,0,0,0,1.77636e-15,2.35099e-38,-7.10543e-15,3.06107e-38

正如其他人指出的那樣,您使用強制轉換的方法不是正確的方法。 另外,請注意您示例中的所有值可能恰好是 0.0(或 -0.0)! 為什么? 因為它們超出了典型平台上float的精度范圍。

不過,您可以使用range 庫float的字符串表示連接到std::vector ,並且不需要任何循環:

#include <vector>
#include <string>
#include <iostream>
#include <range/v3/all.hpp>

std::string concat_my_floats(const std::vector<float>& vec) 
{
    std::ostringstream oss;
    auto convert = [&](float x) { oss.str(""); oss << x; return oss.str(); };
    return vec  
        | ranges::views::transform(convert) 
        | ranges::views::cache1 // We need this, see footnote.
        | ranges::views::join(',')
        | ranges::to<std::string>();
}

int main () {
    std::vector<float> id_list = {0, 1.1, -2.2, 3.3};
    std::cout << concat_my_floats(id_list) << std::endl;
}

這會給你:

0,1.1,-2.2,3.3

如果您想知道cache1業務是什么 - 它與轉換范圍如何成為一個純右值范圍有關,范圍庫出於性能原因不願意加入; 顯然您需要明確允許緩存最后一個元素,盡管它可能很昂貴。 這里

如何將浮點數向量轉換為 char*?

這是將浮點數數組重新解釋為字節的一種方法:

char *ptr = reinterpret_cast<char*>(id_list.data());

除了它不依賴於 C 風格的演員之外,這完全符合您的演員陣容。


但 dump_string.c_str() 返回空

這是因為dump_string剛好在開頭包含一個空的空終止字符串。


我期望將所有值連接成一個長字符串,即:

 0,0,0,0,0,1.77636e-15,2.35099e-38,-7.10543e-15,3.06107e-38........

你的期望被誤導了。 重新解釋浮點數的字節與將它們序列化為可讀文本是不同的。 如果這是您想要的輸出,那么重新解釋不是您需要的操作。

例如,您可以使用字符串流將浮點數轉換為文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM