Dan*_*anz -1 c++ stl vector c++11
我目前正在"现代化"我的玩具编译器代码,以尽可能多地使用C++ 11功能来学习如何编写现代C++.在查看我的代码,搜索现代化的东西时,我发现了这个构造:
for (size_t i = 0; i < _vector.size(); i++) {
for (size_t j = 0; j < _vector[i].length(); j++) {
Run Code Online (Sandbox Code Playgroud)
_vector是一个std::vector<std::string>包含需要编译的文件的源代码.std::string向量中的每一个都是需要编译的一行代码.在编译之前,编译器会检查要编译的代码是否有任何语法错误,此检查的第一步是查找缺少的分号.我这样做是通过逐个查看每个字符并检查所述字符是否是分号.如果是,我通过构建一种迷你语法树来检查是否需要分号,从而确定是否有必要.我目前访问每个角色_vector[i][j]这非常让人联想到ANSI-C(这是你如何访问char*数组中的每个字符),我想用迭代器替换它.据我所知,Iterator是一个类似指针的构造,它指向容器/序列/中的元素.应用指针类比我推断出std::vector<std::string>::iterator指向向量中的字符串,因此理论上std::vector<std::string>::iterator::iterator指向字符串对象中的单个字符.但是因为在STL中没有这样的东西,指针类比在这里没什么用处.所以我的问题是:如何访问每个角色std::vector<std::string>::iterator?
如果您可以访问完整的C++ 11支持,为什么还要使用显式迭代器类型呢?那是auto进来的地方:
std::vector<std::string> sv;
//fill vector...
for(const auto& s : sv)
{
for(const auto& c : s)
{
//'c' represents current character
}
}
Run Code Online (Sandbox Code Playgroud)
我们在这里使用range-base for循环.在第一个循环中,s是一个const引用(*)到来自vector的当前字符串.由于std :: string支持迭代语义,我们也可以使用迭代来迭代它for.c是String(s)中当前字符的const引用.
现场演示:点击.
(*)由于你的循环似乎是只读的,所以应该使用const引用.如果要执行任何修改,只需将其更改const auto&为auto&.