2015-11-11 51 views
0

代碼顯示std :: bad_alloc錯誤不知道如何刪除它消失的push_back時該怎麼辦。請幫助做什麼。這隻有當我輸入一個巨大的字符串時纔會發生,否則它運行得很好。在那裏找到所有可能的子串,lexicographicaly安排它們,然後concatinate它們放回一個字符串的另一個有效途徑????請幫助 日Thnx提前C++代碼顯示使用向量時的bad_alloc錯誤

#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; 
} 
+0

你輸入的字符串有多大? – therainmaker

+0

句子。使用它們。 –

+2

你使用什麼編譯器? 'i'被定義爲'string'類型。那是不對的。它應該是一個完整的類型。編譯器是否不產生任何錯誤或警告? 'c'也遭受同樣的問題。 –

回答

0

如果你有N個字符的字符串,有大約有N^2/2個子字符串,有N^3/6個字符。對於一個巨大的輸入字符串,這可能會很多。

最終您需要將它們全部輸出,因此減少內存佔用的唯一方法是避免同時存儲所有這些子字符串/字符。

一個顯而易見的優化就是隻存儲(開始,結束)索引對而不是子串。當您需要比較或打印子字符串時,可以將它們從索引對和原始字符串中刪除,然後執行任何操作並丟棄它們。

這將幫助您擺脫立方體,但這可能對於真正巨大的琴絃不夠。

另一個可以幫助你的觀點是,出自同一來源的子字符串,其中較短的一個在詞法上較小。你可以用這個事實來當生成最小的尚未使用的子串時減少可能性的數量。爲了不破壞樂趣,我不會在這裏詳細描述,但是可以使用一個數組,其中第i個元素存儲從i開始的最短子字符串的長度,但尚未打印。

+0

我明白爲什麼它不起作用。但我不明白你建議的aleternate解決方案。請精心製作! –

+0

找到所有我需要按字典排序的子字符串後。 –

+0

我已經概述了兩種不同的方法。一個是關於經濟地存儲子串。你仍然按照正常方式對它們進行排序,只是表示方式不同。另一種方法以排序順序生成它們以開始。沒有第二種方法的詳細描述,只有一個提示。你應該自己處理它。 –