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