C++ - 以特定方式输入字符串

标签 c++ arrays string vector character

我想以特定方式从用户那里获取输入,例如以下方式:

L1 L2 L3 N 

L1,L2,L3 是由空格分隔的字符串。 N是一个整数。我尝试使用 cin 但速度很慢。我需要快速获得输入。字符串 L2 也重复了 N 次。所以我必须存储 l1 + l2*N + l3。我试过字符串,但它变得太慢了。我得了 TLE。

这是我存储它们的方式:

 #include<bits/stdc++.h>
using namespace std;
int main (){
 string l1,l2,l3;
  int n;
  cin>>l1>>l2>>l3>>n;
  string r;
 r.reserve(l1.size()+n * l2.size()+l3.size());
r += l1;
 for (int i=0; i<n;i++)
  r +=l2;

 r += l3;
 cout<<r<<endl;
return 0;
 }

And then iterated it in 2 separate for loops with maximum 1000 iterations in each loop.

我怎样才能有效地存储它们?我知道 vector ,但我不擅长它们。因此,如果有人知道如何将它们存储在 vector 中的这个序列中,请帮助我。或者如果它们可以存储在字符数组中,那么该怎么做?

最佳答案

好的。因此,让我们从将实际读数与其他代码隔离开来开始:

struct foo { 
    std::string l1, l2, l3; 
    int n;

    friend std::istream &operator>>(std::istream &is, foo &f) { 
       return is >> f.l1, >> f.l2 >> f.l3 >> n;
    }
};

这样我们就可以将一个充满这些记录的文件读入一个 vector 中,像这样:

std::vector<foo> data { std::istream_iterator<foo>(infile), {} };

我猜(就其本身而言)不会成为瓶颈。如果确实有必要,可能有更快的方法来完成这项工作,但我怀疑是否真的需要它。

根据关于如何进行搜索的评论,我们可以在不将第二个字符串扩展到 n 的情况下进行搜索。出现 l2 .

搜索的是从字符串开头到最后(最右边)出现的某个其他字符的一个字符。

由于“结束”模式是单个字符,我们可以很容易地做到这一点,而无需扩展中间字符串 ( L2)。逻辑基本上是:

if L3 contains end_pattern
   total = count(L1) + count(L2) * n + count(L3.substr(0, pattern_pos))
else if L2 contains end_pattern
    total = count(L1) + count(L2) * (n-1) + count(L2.substr(0, pattern_pos))
else if L1 contains end_pattern
    total = count(L1.substr(0, pattern_pos))
else
    total = 0; // pattern isn't present anywhere

至少如评论中所述,评论中描述的O(N2)算法似乎没有任何必要。

关于C++ - 以特定方式输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40004881/

相关文章:

c++ - QThread 与 QTimer 和 QSerial - 育儿

c++ - 点的法线通过其在 STL 网格模型上的位置

c++ - MT还是MD用于静态释放?

php - 如何使用 PHP 连接两个数组?

c++ - 如何检测仅使用 cppcheck 从未使用的函数调用的函数?

java - 如何使一个类方法与数组中的另一个类方法一起使用?

c - 将数组传递给函数错误?

c++ - 将 char 乘以整数 (c++)

C:指向相同值的指针数组

python - 字节数组到十六进制字符串