【发布时间】:2012-05-08 22:21:48
【问题描述】:
我知道这是一个非常愚蠢的问题,但我想澄清一下。
假设我有一个字符串向量看起来像,
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 时出现错误。
有什么办法可以解决这个问题吗? 很抱歉有歧义。
【问题讨论】:
-
应该可以。迭代器实现
operator-。此外,迭代器不仅仅是指针。例如,std::list将其元素保存在非连续内存中。 -
我会说你的问题有点做作。现实世界的问题通常涉及整个容器,或者以其他方式可以用迭代器很好地编写的选择(如
remove_if或find),迭代器确实更合适谈论集合而不是索引的方式。 -
前向迭代器支持递增,双向迭代器支持递增和递减,随机访问迭代器支持两者以及像
begin()+4这样的附加算术...向量使用随机访问迭代器,所以你有选择。我相信boost::tokenizer默认为std::string::const_iterator -
boost::token_iterator是一个 forward_iterator,这就是你有问题的原因。 -
哦,我明白了。在这种情况下是否可以设置迭代步长?
标签: c++ iterator boost-tokenizer