这是我的方式,但是,我确实认为有一种更聪明的方式,这就是我提出这个问题的原因。能告诉我,没有经验的新C ++程序员,有什么方法可以更好地完成这项任务?
谢谢。
string word;
getline(cin, word);
// results - I need only those 5 numbers:
int l = word.length();
int c1 = word[0];
int c2 = word[1];
int c3 = word[l-2];
int c4 = word[l-1];
为什么我需要这个?我想编码大量非常长的字符串,但我发现我真的只需要我提到的那5个值,其余的都是多余的。将加载多少个单词?足以使这部分代码值得工作:)
答案 0 :(得分:2)
我会告诉你,这是值得优化到极致的事情。您在问题中显示的方法已经是最直接的方法。
我首先使用内存映射将文件块一次映射到内存中。然后,遍历缓冲区以查找换行符。在前一个换行符之后的前两个字符和刚刚找到的换行符之前的最后两个字符。从第一个换行中减去第二个换行符的地址,得到该行的长度。冲洗,起泡,重复。
显然,需要对边界进行一些小心处理,其中一个换行符位于前一个映射缓冲区中,另一个换行符位于下一个映射缓冲区中。
答案 1 :(得分:1)
前两个字母很容易获得且快速。
问题在于最后两个字母。
为了读取文本行,必须扫描输入,直到找到行尾字符(通常是换行符)。由于您的文本行是可变的,因此这里没有快速解决方案。
您可以通过将文件数据块从文件读入内存并在内存中搜索行结尾来缓解此问题。这样可以避免调用getline
,并且可以避免对行尾的双重搜索(一次由getline
进行,另一次由您的程序进行搜索)。
如果您更改要修复的输入,则可以加快此问题。
答案 2 :(得分:0)
如果你想优化这个(虽然我无法想象为什么你会这样做,但你肯定有你的理由),首先要做的是摆脱std::string
和直接读取输入。这将为您节省整个字符串的一个副本。
如果你的输入是stdin
,你也会因缓冲而减慢速度。正如已经说过的那样,通过从二进制模式的文件中读取大块并自行完成线路检测,可以实现最佳速度。
无论如何,您最终会受到I / O带宽(磁盘访问速度)的限制。