2013-07-28 64 views
0

迭代結構向量時訪問結構成員我想訪問Line結構的token_list中的「line_number」。爲什麼token_line_number = line.token_list[i+i].line_number;返回'1'而不是'2'?我包含了兩種不同的方法,我可以使用'2',但我想說明爲什麼我的第一個代碼片段返回'1'。如何使用vector :: operator []

#include <string> 
#include <vector> 
int main() 
{ 
    struct Token 
    { 
     std::string text; 
     int line_number; 
    }; 
    struct Line 
    { 
     std::vector<Token> token_list; 
    }; 
    Token token; 
    Line line; 

    token.text = "A"; 
    token.line_number = 1; 
    line.token_list.push_back(token); 
    token.text = "B"; 
    token.line_number = 2; 
    line.token_list.push_back(token); 

    int token_line_number = 0; 
    int i = 0; 
    if (i + 1 < line.token_list.size()) 
    { 
     token_line_number = line.token_list[i+i].line_number; // <-- I want this to be '2'. Instead it is '1'. 
     Token token = line.token_list[i+1];      
     token_line_number = token.line_number;    // This is '2'. 
    } 
    token_line_number = 0; 
    std::vector<Token>::const_iterator iter; 
    if (iter + 1 != line.token_list.end()) 
     token_line_number = (iter + 1)->line_number;   // This is '2'. 
} 

回答

1

您沒有在此改變的i價值,所以它是0

int i = 0; 
if (i + 1 < line.token_list.size()) 
{ 
    token_line_number = line.token_list[i+i].line_number; // i has not been changed from 0 

記住0+00。所以line.token_list[i+i]是。

+0

哦,天哪,我很抱歉。我一直盯着這個這麼久,我沒有注意到它不是i + 1。那很愚蠢。謝謝您的幫助! –

+0

@ Macbeth'sEnigma爲什麼不使用++ i,然後再丟掉+1?或者,更好的是,如果你在C++ 11上,爲什麼不用(const auto&token:line.token_list)? – em70

+0

@emaster我簡化了代碼。在我們的應用程序中,我們需要在下一個標記中「向前看」,同時仍然跟蹤當前標記,因此不需要++ i的副作用。我們使用MSVS 2010,因此沒有完整的C++ 11。我不確定自動是否可用。我使用[]是因爲實際的應用程序使用指針與迭代器。我真正的問題(真正的)是我需要一個新的處方。 :) –