从输入中获取字符串的两个第一个和最后一个字符的快速方法

Fast way to get two first and last characters of a string from the input

这是我的方法,但是,我相信有更聪明的方法,这就是我问这个问题的原因。你能告诉我,没有经验的新 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 个值,其余的都是多余的。将加载多少个单词?足以使这部分代码值得处理:)

我会相信你的话,这是值得优化到极致的东西。您在问题中显示的方法已经是最直接的方法了。

我首先使用内存映射将文件块一次映射到内存中。然后,循环遍历缓冲区以查找换行符。取前一个换行符之后的前两个字符和刚找到的换行符之前的最后两个字符。从第一个换行符中减去第二个换行符的地址以获得该行的长度。冲洗、起泡并重复。

显然需要注意边界,一个换行符在前一个映射缓冲区中,一个换行符在下一个映射缓冲区中。

前两个字母很容易获得,速度也很快。

问题出在最后两个字母上。

为了读取文本行,必须扫描输入直到找到行尾字符(通常是 换行符)。由于您的文本行是可变的,因此这里没有快速解决方案。

您可以通过将文件中的数据块读入内存并在内存中搜索行尾来缓解此问题。这避免了对 getline 的调用,并且避免了对行尾的双重搜索(一次由 getline 进行,另一次由您的程序进行)。

如果您更改要修复的输入,可以加快此问题的速度。

如果你想优化这个(虽然我无法想象你为什么要那样做,但你肯定有你的理由),首先要做的是摆脱 std::string 和直接读取输入。这将为您节省一份整个字符串的副本。

如果您的输入是 stdin,缓冲也会减慢您的速度。正如已经说过的那样,最好的速度是通过以二进制模式从文件中读取大块并自己进行行尾检测来实现的。

无论如何,你最终都会受到I/O带宽(磁盘访问速度)的限制。