我创建了一个程序,该程序读取数据(并返回每个令牌),如果流中遇到某个值,则将其替换为另一个值或一系列其他值。
例如:
name: [name]
id: [ID]
应该给出:
name: Bob
id: 23 87 87 9
这是我的代码的样子:
token lexer::next() {
token ret;
if (IsData) {
if (DataValue.empty()) IsData = false;
else {
ret = DataValue.front();
DataValue.erase(DataValue.begin());
return ret
}
}
// some code to manage others tokens (a value is also assigned to 'ret')
if (Datas.IsData(ret.value)) {
// here, ret.value represent the '[value]' saw above
DataValue = Datas.get(ret.value);
IsData = true;
return next();
}
return ret; // for "normal" tokens
}
DataValue
仅仅是std::vector<token>
。并且每次我们返回第一个元素时,该元素都会被删除,直到没有更多为止。
只有一个替换值时,它起作用。但除此之外,我还会收到此错误消息:
我不明白...我唯一的假设是,由于该函数一次不能返回一个以上的令牌,因此它侵占了其他调用(因为要替换的de值可以计数超过1个令牌)。但是我不确定。
你有什么主意吗?
答案 0 :(得分:0)
如果我正确地遵循了您的解释和您的代码,则似乎此行是罪魁祸首:
DataValue = Datas.get(ret.value);
DataValue
是一个包含多个元素的向量;您已经删除了第一个(带有.erase(DataValue.begin())
),现在应该代替它。
但是-由于您没有提供minimal, complete and verifiable example,因此很难确定问题出在哪里。
PS-注意,移除向量的第一个元素并添加另一个第一个元素通常效率不高-您将反复移动整个向量的上下文。