2009-07-04 72 views
1

我正在寫一些有很多替代的代碼。來插入()或使新的

有一個列表<char> productions它有一堆字符在裏面。

我多次需要生產對應於它在地圖<字符的規則,字符* > productionRules替換每個字符。因此製作中的每個字符可能會被替換爲零個或多個字符,如productionRules所示。

我想有2種方法來做到這一點:

  1. 疊代生產和.insert()這樣的生產.erase()'ing之前的每個元素

  2. 創建的所有替換字符NEW list <char> newProductions然後重新分配作品以參考newProductions

哪個更好?要.insert()和.erase()一大堆或創建一個新的?

回答

2

這取決於每個字符被替換爲零或> 2個字符的可能性。如果這種替換不太可能發生,那麼你可能會通過迭代來獲勝。但是,如果您可能經常執行該操作,那麼您幾乎肯定應該創建一個新列表。

您可以讓您的算法嘗試遍歷列表,如果您發現必須執行零或> 2替換,則創建一個新列表。是否贏得勝利取決於你是否有可能遇到你必須進行這種替代的情況。

1

創建一個總是追加到最終效率更高,實現起來更簡單。

0

我不明白如何製作副本可能會更快。只需處理更換大小的每個案例。

list<char>::iterator q; 

for (list<char>::iterator p = productions.begin(); p != productions.end(); p = q) 
{ 
    // save the next position since we might be deleting p 
    q = p; 
    ++q; 

    char* p_rule = productionRules[*p]; 

    // if points to empty string, nuke 
    if (!*p_rule) 
     productions.erase(p); 
    else 
    { 
     // if single char, replace 
     *p = *p_rule; 

     // insert all other chars 
     ++p_rule; 
     while (*p_rule) 
     { 
      // check me on this 
      // I want to insert before q 
      productions.insert(q, *p_rule); 
      ++p_rule; 
     } 
    } 
}