我有这些市场价格数据的大型pcap文件。平均每个20gb。文件被分成数据包。数据包分为标题和消息。消息分为标题和字段。字段分为字段代码和字段值。
我正在一次读取一个角色的文件。我有一个文件阅读器类,它读取字符并通过const ref将字符传递给4个回调函数,on_packet_delimiter,on_header_char,on_message_delimiter,on_message_char。消息对象使用类似的函数来构造其字段。
到目前为止,我发现效率几乎没有下降,只是阅读字符并且没有对它们做任何事情。
我的代码部分,我处理邮件标题并提取邮件的工具符号,会大大减慢过程。
void message::add_char(const char& c)
{
if (!message_header_complete) {
if (is_first_char) {
is_first_char = false;
if (is_lower_case(c)) {
first_prefix = c;
} else {
symbol_vector.push_back(c);
}
} else if (is_field_delimiter(c)) {
on_message_header_complete();
on_field_delimiter(c);
} else {
symbol_vector.push_back(c);
}
} else {
// header complete, collect field information
if (is_field_delimiter(c)) {
on_field_delimiter(c);
} else {
fp->add_char(c);
}
}
}
...
void message::on_message_header_complete()
{
message_header_complete = true;
symbol.assign(symbol_vector.begin(),symbol_vector.end());
}
...
在on_message_header_complete()
我将这些字符喂给symbol_vector
。一旦标头完成,我使用矢量迭代器转换为字符串。这是最有效的方法吗?
答案 0 :(得分:1)
怎么样:
std::string myStr(myVec.begin(), myVec.end());
虽然这有效,但我不明白为什么你需要首先使用矢量。只需从头开始使用std::string
,然后使用myStr.append()
添加字符或字符串。
以下是一个例子:
std::string myStr = "abcd";
myStr.append(1,'e');
myStr.append(std::string("fghi"));
//now myStr is "abcdefghi"
答案 1 :(得分:1)
除了量子物理学家的答案之外:std :: string的行为与矢量非常相似。如果您打算使用它来提高效率,即使是“保留”功能也可以在字符串类中使用。
添加字符非常简单:
std::string s;
char c = 's';
s += c;
您可以直接将这些字符添加到您的会员中,您也可以。但是如果你想保持你的成员清理直到收集整个字符串,你仍然应该使用std :: string对象而不是vector。然后,您将字符添加到临时字符串中,完成后,您可以交换内容。没有复制,只是指针交换(以及一些额外的数据,如容量和大小......)。