C++迭代器循环与索引循环

标签 c++ iterator boost-tokenizer

我知道这是一个非常愚蠢的问题,但我想澄清一下。

假设我有一个字符串 vector ,如下所示,

vector<int> vnTemp; // suppose this vector has {1,2,3,4,5}
vector<int>::iterator vn_it;

//Now, I want to print out only 1 to 4.
for(int i=0; i<4; ++i)
    cout << vnTemp[i] << endl;

很简单。但是当我想用迭代器打印出等价的结果时怎么办呢?例如,

// .. continuing from the code above
for(vn_it = vnTemp.begin(); vn_it != vnTemp.end()-1; ++vn_it)
    cout << *it << endl;

当然,vnTemp.end()-1 会导致错误,因为它是指针。

在这种情况下,for 循环的等价物是什么? 当它们都在优化(-o)模式下编译时是否有任何性能差异?


编辑:

我刚刚意识到这实际上适用于 vector。 当我使用 boost::tokenizer 时出现问题 代码是这样的:

typedef boost::tokenizer<boost::char_separator<char> > tokenizer;

boost::char_separator<char> sep("_");
tokenizer::iterator tok_it;

tokenizer tokens(strLine, sep); //strLine is some string line
for(tok_it=tokens.begin(); tok_it != tokens.end(); ++tok_it){
... }

这是原始代码,当我尝试在 for 循环中说 tokens.end()-1 时发生错误。

有什么办法可以解决这个问题吗? 抱歉含糊不清。

最佳答案

boost::tokenizer 只提供一个前向迭代器;这意味着您不能从分词器迭代器中减去。如果您希望您的循环避免处理最后一个标记,您将必须在处理您所在的标记之前“先行”。像这样

tokenizer tokens(strLine, sep); //strLine is some string line
tok_it = tokens.begin();
if(tok_it!=tokens.end())
{
    ++tok_it;
    for(auto last_tok = tokens.begin(); tok_it != tokens.end(); ++tok_it){
        // Process last_tok here
        . . .
       last_tok = tok_it;    
    }
}

编辑: 另一种方法是将 token 复制到具有更灵活迭代器的容器中:

std::vector<std::string> resultingTokens(tokens.begin(), tokens.end());
for(auto tok=resultingTokens.begin(); tok!=resultingTokens.end()-1; ++tok)
{
    // whatever
}

关于C++迭代器循环与索引循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507414/

相关文章:

c++ - 如果满足条件或发生错误

JavaScript。无法用Object.keys()迭代一个对象来获取new

pandas - 迭代 Groupby 对象的字段

基础对象更改时的Python迭代器

c++ - 在 C++ 中标记 "Braced Initializer List"样式的字符串(使用 Boost?)

c++ - Directx9 : Reset Device after Ctrl+Alt+Del

c++ - 值初始化 vs Calloc vs 手动初始化速度

c++ - 将 boost::tokenizer 与 boost::iterator_range 结合使用

c++ - isupper() 是宏还是函数?

c++ - 从 const char* 到迭代器错误的 "no known conversion"- 另一种方式