如何将字符串向量转换为特定结构的向量

Posted

技术标签:

【中文标题】如何将字符串向量转换为特定结构的向量【英文标题】:How to convert a vector of string to a vector of specific struct 【发布时间】:2016-06-19 16:11:57 【问题描述】:

我有以下结构:

 struct msg_latency
        double time;
        string data;
    ;

我有一个字符串向量,其中包含以下字符串: "2344.5435345 你好世界\n:"

我必须迭代字符串的向量并将每个字符串转换为 msg_latency 结构。

 vector<msg_latency> vec_msg

    convert_str2struct(vector<string> str_vec, vector<msg_latency> msg_vec)
    
        vector<string>::iterator msg_it;

        for(msg_it=str_vec.begin(); msg_it!= str_vec.end(); ++msg_it)
        
            ///TODO
        
    

在待办事项中,我想写如下内容:

msg_vec[i].time= *msg_it.substr(0, *msg_it.find(" "));
msg_vec[i].data= *msg_it;

如前所述,如何初始化 msg_vec?

我可以这样做(在 TODO 中): msg_vec.push_back(*msg_it.substr(0, *msg_it.find(" ")), *msg_it)?

【问题讨论】:

使用std::istringstream 解析来自std::string 的数字。 所以您想将transform 一个向量转换成另一个向量? @Joachim Pileborg- 是的。 那么std::transform 函数将是一个好的开始。另一种方法是弄清楚如何将源向量中的字符串拆分为doublestring(其中@πάνταῥεῖ 关于std::istringstream 的建议是一个好的开始)。 【参考方案1】:

正如 cmets 中所建议的,这是 std::transformstd::istringstream 的理想应用程序。

如果我理解您的字符串格式,您可以在读取双精度后使用std::getline 读取字符串的剩余部分:

#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <iostream>

msg_latency
convert(const std::string& str) 
    msg_latency msg;
    std::istringstream ss(str);
    ss >> msg.time >> std::ws;  // read double and whitespace separator         
    getline(ss, msg.data);      // read the rest of the string
    return msg;


std::vector<msg_latency>
convert_str2struct(const std::vector<std::string>& str_vec) 
     std::vector<msg_latency> ret(str_vec.size());
     std::transform(str_vec.begin(), str_vec.end(), ret.begin(), convert);
     return ret;


int main() 
    auto vec_str = std::vector<std::string>"2344.5435345 hello world\n", "42.0 foo\n";

    auto vec_msg = convert_str2struct(vec_str);

    for (const auto& msg : vec_msg) 
        std::cout << msg.time << "\n";
        std::cout << msg.data << "\n";
        std::cout << "\n";
    

Live demo.

【讨论】:

肯定有比这更简单的东西。我不能只执行以下操作(在 TODO 中):msg_vec.push_back(*msg_it.substr(0, *msg_it.find(" ")), *msg_it)? @sara8d 如果您有自己的解决方案,我建议您将其发布为答案并让人们对其进行评估,但我不知道这是如何工作的。看起来也没有那么简单。 @sara8d 请注意,您可以在“TODO”中使用我的convert 函数,例如:msg_vec.push_back(convert(*msg_it)); 只是我认为使用std::transform 更清晰,可以更快。 @Darhuuk I measured it 我看不出性能上有明显的差异。我认为计算机在将 POD 向量归零方面非常快,编译器甚至可能足够聪明以优化该步骤(请参阅this 答案)。此外,虽然back_inserter 不必重新分配,但它可能仍需要检查它是否应该重新分配。 @Chris Drew 够公平的。只是想如果您提出的技术用于“重”对象,我会提到它。

以上是关于如何将字符串向量转换为特定结构的向量的主要内容,如果未能解决你的问题,请参考以下文章

如何将包装为字符串的向量转换为熊猫数据框中的numpy数组?

如何将字符串数字的单元格数组转换为数值向量[重复]

文本分类,如何将文本字符串转换为向量表示

如何编写一个函数将字符向量转换为其元素唯一对的字符向量?

将字符向量转换为单个字符串[重复]

将字符串向量转换为双二维数组向量