我有以下结构:
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})
?
答案 0 :(得分:1)
根据评论中的建议,这是std::transform
和std::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";
}
}