我希望能將一個std::string物件視窗化為長度為N的磁區,例如(使用一個函式update):
int main(){
std::string s = "abcdefg"/span>;
update<2>(s)。
return 0;
}
呼叫上述程式的結果應該是:
ab
bc
cd
ef
fg
我有以下版本的update函式:
template<std::size_t size>
void update(std::string s){
std::string result(size, '');
std::stringstream ss{s};
int iterations = s.length() - size。
for (int i = 0; i<iterations; i ) {
ss.read(&result[0], result.size()。
std::cout << result << std::endl;
}
return;
}
但是這跳過了初始字符位于奇數索引的組合(在我的例子中組合的數量是正確的,盡管有一個重復)
ab
cd
ef
gf
gf
一個附帶說明是,如果有任何尾部字符,那么這些字符應該從列印的值中省略(盡管我認為這將被for回圈的引數所覆寫)
最后要說明的是,我希望這一點能夠盡可能地優化,因為我通常會使用長度非常大的字串(>5M字符長)--我目前的解決方案可能不是最好的,所以我愿意接受替代策略的建議。
uj5u.com熱心網友回復:
使用C 17,你可以這樣做,這樣做更具有可讀性:
void update(std: :string_view s, int size) {
const int iterations = s.size()- size。
for (int i = 0; i <= iterations; i ) {
std::cout << s.substr(i, size) < < "
"。
}
string_view正是為了這個目的而制作的,用于快速讀取字串。string_view::substr是常數復雜性,而string::substr是線性的。
另外,除了Nick提到的,你的代碼還有一些其他的小問題:
。- std::endl fflushes the stream, it heavily impacts performance. 在這里,你可以直接使用 '' '來做一個換行。
- 最后的回傳絕對是多余的,無效函式不需要回傳 。
- 模板化的目的是什么?這將很容易使你的代碼臃腫,而沒有任何可衡量的性能提升。只需將N作為一個引數傳遞即可。
- 此外,你的main被宣告為void,而應該是int(甚至更多,因為你在最后回傳一個值)
uj5u.com熱心網友回復:
對于range-v3,你可以使用sliding視圖:
std::string s = "abcdefg"/span>。
for (auto r : s | ranges::view::sliding(2) {
std::cout << r << std::endl;
}
uj5u.com熱心網友回復:
你對ss.read的呼叫將總是讀取兩個字符,然后將字串流中的ptr推進兩個字符。所以你永遠不會在每一行的開始讀/重復前一個字符。
如果你想按你的方式做,那么你必須單獨跟蹤最后一個字符。
。
#include <iostream>
#include <sstream>
template<std::size_t size>
void update(std::string s){
std::string result(size, '');
char lastChar;
std::stringstream ss{s};
int iterations = s.length() - size;
int read = 0;
if (ss.readsome(&result[0], 1) {
lastChar = result[0]。
}
for (int i = 0; i < iterations; i ) {
if (read = ss.readsome(& result[0], size - 1) {
std::cout << lastChar << result << std::endl;
lastChar = result[read - 1]。
}
}
}
盡管如此,上述做法從性能上講絕對不是最好的方法。你應該能夠在沒有任何字串流或讀取函式的情況下完成所有這些作業,只需迭代字串即可。就像這樣
。
#include <iostream>
void update(std::string s, size_t size){
int len = s.length()。
for (int i = 1; i < len; i =size-1) {
fwrite(&s[i-1], size, 1, stdout) 。
putchar('
')。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/307843.html
標籤:
