如何将字符串向量转换为特定结构的向量
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
函数将是一个好的开始。另一种方法是弄清楚如何将源向量中的字符串拆分为double
和string
(其中@πάνταῥεῖ 关于std::istringstream
的建议是一个好的开始)。
【参考方案1】:
正如 cmets 中所建议的,这是 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";
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 够公平的。只是想如果您提出的技术用于“重”对象,我会提到它。以上是关于如何将字符串向量转换为特定结构的向量的主要内容,如果未能解决你的问题,请参考以下文章