使用向量时显示bad_alloc错误的c ++代码

时间:2015-11-11 05:33:37

标签: c++ string vector bad-alloc

代码显示std :: bad_alloc错误在删除push_back消失时不知道该怎么办。请帮忙做什么。只有当我输入一个巨大的字符串时才会发生这种情况,否则它会完全运行。有没有另一种有效的方法来找到所有可能的子串,排列lexicographicaly然后将它们重新组合成一个字符串????请帮助 thnx提前

#include <cmath>
#include <set>
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include<string> 
#include <algorithm>

using namespace std; 

bool sortByString(string &t1, string &t2)
{
   return t1 < t2;
}

int main() {

   string s,sub,i,c,q; 

   int T;
   cin>>T;

   while(T--){

      cin >> s;

      int length = s.length();

      cin>>q;
      vector<string> ss;

      for (c = 0; c < length; c++)
      {
         for (i =length-c;i>=1; i--)
         {
            ss.push_back(s.substr(c,i));
         }
      }

      s="";

      set<string> se(ss.begin(),ss.end());
      ss.assign(se.begin(),se.end());

      vector<string>::iterator p;

      for( p=ss.begin();p!=ss.end();++p)
         s.append(*p);   

      cout<<s[q-1]<<endl;
   }

   return 0; 
}

1 个答案:

答案 0 :(得分:0)

如果您有一个N个字符的字符串,则有大约N ^ 2/2个子字符串,其中包含N ^ 3/6个字符。对于巨大的输入字符串,这可能很多。

最终你需要输出它们,所以减少内存占用的唯一方法是避免同时存储所有这些子串/字符。

一个明显的优化是仅存储(开始,结束)索引对而不是子串。当你需要比较或打印子串时,你可以用索引对和原始字符串制作它们,做任何事情,并丢弃它们。

这将帮助你摆脱多维数据集,但这对于真正庞大的字符串来说可能还不够。

另一个可以帮助你的观察是,在具有相同来源的子串中,较短的一个在词典上较小。你可以使用这个事实,例如减少生成最小但尚未使用的子字符串时的可能性。我不会在这里详细介绍,以免破坏乐趣,但你可以使用一个数组,其中第i个元素存储从i开始的最短子串的长度,但是还没有打印出来。