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

时间:2016-06-19 16:11:58

标签: c++ vector struct

我有以下结构:

 struct msg_latency{
        double time;
        string data;
    };

我有一个包含字符串的字符串向量: " 2344.5435345你好世界\ n:"

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

 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
        }
    }

在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})

1 个答案:

答案 0 :(得分:1)

根据评论中的建议,这是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