vector <string> array?</string>发生了什么

时间:2015-04-03 15:57:25

标签: c++ arrays vector

我正在写一个lex扫描器,我在其中定义一个数组如下:

// array of vector<string>
std::vector<std::string> Lexicals[5] = {
    //  [0] OPERATORS (pre-initialized with values)
    {"...", "..."},
    //  [1] PUNCTUATIVES (pre-initialized with values)
    {"...", "..."},
    //  [2] KEYWORDS (pre-initialized with values)
    {"...", "..."},
    //  [3] IDENTIFIERS  - add as found
    std::vector<std::string>(),
    //  [4] LITERALS  - add as found
    std::vector<std::string>()
};

使用以下enum,我可以评估lexType并按vector值(0 - 4)获取匹配的enum

enum LexType {
    OPERATOR, 
    PUNCTUATION, 
    KEYWORD, 
    IDENTIFIER, 
    LITERAL
};

导致问题的是IDENTIFIERLITERAL选项。以下逻辑尝试检索正确的向量容器,并添加新值并标识位置或标识现有值的位置:

case LexType::IDENTIFIER:
case LexType::LITERAL: {
    string val(read_buffer(), m_length);
    //  Lexicals[3] || [4]
    vector<string> lex = Lexicals[m_lexType];
    vector<string>::iterator it;

    //  make sure value is not already in the vector
    if(!lex.empty()){
        it = find(lex.begin(), lex.end(), val);
        if(it == lex.end()) {                    
            lex.push_back(val);
            it = std::find(lex.begin(), lex.end(), val);
        }
    } else {                
        lex.push_back(val);
        it = find(lex.begin(), lex.end(), val);
    }

    m_lexical = it - lex.begin();
}
break;

在第一次传递后的每次迭代中,绕过!lex.empty()。我只想弄清楚发生了什么。

1 个答案:

答案 0 :(得分:3)

问题很可能是这一行:

vector<string> lex = Lexicals[m_lexType];

在这里,您可以通过值获取向量,这意味着已复制。然后,当您稍后执行lex.push_back(val)时,您只会附加到副本而不是原始矢量。

而是将lex作为实际(原始)向量的引用

vector<string>& lex = Lexicals[m_lexType];