2011-02-01 87 views
1

我正在解決加速C++中的問題 我們有一個程序,它將字符串存儲在向量中並根據一定的規則進行輸出。 原始代碼片段如下。如何在C++中訪問列表中的元素

typedef vector<string> Rule; 
typedef vector<Rule> Rule_collection; 
typedef map<string, Rule_collection> Grammar; 


// read a grammar from a given input stream 
Grammar read_grammar(istream& in) 
{ 
    Grammar ret; 
    string line; 

    // read the input 
    while (getline(in, line)) { 

     // `split' the input into words 
     vector<string> entry = split(line); 

     if (!entry.empty()) 
      // use the category to store the associated rule 
      ret[entry[0]].push_back(
       Rule(entry.begin() + 1, entry.end())); 
    } 
    return ret; 
} 

然後我們要求使用列表而不是向量。

因此,上述所有向量將成爲列表。

我堅持的是如何處理行開始ret [entry]] push_back等。還有什麼要在規則後... 我已經嘗試使用entry.begin()但那doesn沒有工作。

任何援助將不勝感激。

+0

?他們全部? – 2011-02-01 15:41:29

+0

`開始`實際工作:-) – 2011-02-01 15:41:35

+0

是的,這是正確的larsmans。我認爲作者希望我們瞭解向量和列表的工作方式之間的區別。 – 2011-02-01 15:51:34

回答

0

你需要像這樣的東西來取代你的代碼:

ret[*(entry.begin())].push_back(
      Rule(++(entry.begin()), entry.end())); 
VECTOR`你要哪`用`list`更換
1
entry.begin() 

返回一個迭代器列表的開始,而

entry [0] 

矢量返回的第一要素,所以我想你想的東西像下面

*(entry.begin()) 

編輯:

希望我明白你在問什麼......除了開始和結束應該返回可比的VA爲向量和列表提供

+0

`entry [0]`不能在列表中全部使用 – 2011-02-01 15:42:15

0

begin()爲您提供了一個迭代器到列表的開頭。你可以解引用迭代器,它給你的第一個值...

ret[*(entry.begin())].push_back(... 

或者你可以使用front()函數,它返回在列表(技術上的參考前面的元素,但應該在這方面的工作案件)。

ret[entry.front()].push_back(... 

編輯:

正如其他人所指出的那樣,這個工程提供entrystd::list<string>,因爲你暗示。

0

ret[entry[0]]調用Grammar::operator[]傳遞一個string:包含在entry[0]串,其是第一字符串放在這種載體通過split

假設split返回std::list,你應該只取列表的第一個元素:

ret[ entry.front() ] ... // where entry is a std::list<string> 
2

與列表中,您可以執行大部分可以用矢量操作的,但你不能使用entry[0]因爲有沒有隨機存取。

entry.front()將取而代之。

另外,您不能將1添加到entry.begin(),因爲它是雙向的並且不支持+,但您可以將其分配給臨時迭代器,然後++it

0

這段代碼很通用 - 它應該只在你改變typedefs的時候才起作用,除了像std::list這樣的一些小問題不給隨機訪問迭代器,並且由於你不顯示代碼,我不會說話約split