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

C++ 如何将字符串向量转换为特定结构的向量,c++,vector,struct,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,

我有以下结构:

 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
        }
    }
如何按照上面所述初始化msg_vec

我可以(在待办事项中)这样做吗
msg_vec.push_back({*msg_it.substr(0,*msg_it.find(“”),*msg_it})

正如评论中所建议的,这是和的理想应用程序

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

#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";
    }
}
#包括
#包括
#包括

#include.

使用
std::istringstream
解析
std::string
中的数字。是否要将一个向量转换为另一个向量?@Joachim Pileborg-是。那么该函数将是一个良好的开始。另一个问题是如何将源向量中的字符串拆分为
double
string
(其中@πάντα)ῥεῖ 关于的建议是一个好的开始)。一定有比这更简单的事情。我能不能只做以下(在TODO中):msg_vec.push_back({*msg_it.substr(0,*msg_it.find(“”),*msg_it})?@sara8d如果你有自己的解决方案,我建议你把它作为一个答案发布,让人们对它进行评估,但我不知道这是怎么回事。它看起来也没那么简单。@sara8d注意你可以在“TODO”中使用我的
convert
函数,比如:
msg\u vec.push\u back(convert(*msg\u It))
只是我认为使用
std::transform
更清晰、更快。@Darhuuk我和我看不到性能上的明显差异。我认为计算机在将POD向量归零方面非常快,编译器甚至可能足够聪明来优化这一步(见答案)。另外,尽管
后插入器
不需要重新分配,但它可能仍然需要检查是否应该重新分配。@Chris Drew Fair。我想我会提到它,以防你提出的技术用于“重”物体。
#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";
    }
}