是否有任何(方便的)方法可以在 C++11 "foreach"语句中检索当前迭代 #?
Is there any (convenient) way of retrieving current iteration # inside C++11 "foreach" statement?
我想知道是否有可能以某种方式从c++11 foreach语句中提取当前的迭代数。
在这样的代码中:for(auto &i: vect)
if(i == 0) zero_value_index = /* here I want my index */;
我找不到另一种方法,但使用老式的for
和int i
来轻松获得我的索引。
想法?
你可以,我不知道,计算迭代:
int i = 0;
for (auto& el : container) {
if (el == 0) zero_value_index = i;
++i;
}
除非你遵循Ben Voigt的答案,否则简短的答案是否定的。
既然你有一个vector
,那么老式的for循环就没有什么问题了。其他的都是不必要的复杂。
typedef std::vector <int>::size_type size_type ;
for(size_type i = 0; i < vect.size (); ++i) {
// ...
}
这可以用于其他容器,如字符串,但不能用于其他容器:
template <class Container>
void DoStuff (Container &container)
{
typedef Container::size_type size_type ;
for (size_type i = 0; i < container.size (); ++i) {
//...
}
}
或者你可以写一些像这样难看的东西:
template <class Container>
struct StoreIndex
{
typedef typename Container::size_type size_type ;
typedef typename Container::value_type value_type ;
StoreIndex (Container &container) : container (container), index (0)
{
}
size_type index ;
Container &container ;
value_type operator () () {
if (container [index] == 0) {
return index++ ;
}
else {
return container [index++] ;
}
}
};
然后做:
std::generate (std::begin (v), std::end (v), StoreIndex <std::vector <int> > (v)) ;
当然,这和其他两种方法一样有局限性(比如std::map
)。
一夜之间我又有了另一个想法。答案是肯定的。不用计数就能找到索引。这是因为以下两条规则:
- std::vector中的
- 数据保证是连续的。
- 减去两个指针会得到一个以"对象大小"为单位的距离,而不是字节。
.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<string> rhyme = { "humpty", "dumpty", "sat", "on", "a", "wall" };
int main()
{
for(const auto& s : rhyme) {
if (s == "on") {
const size_t index = &s - rhyme.data(); // index computed here
cout << "found at index " << index << endl;
}
}
return 0;
}
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- 没有显式声明的int[]中的foreach
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- c++使用foreach使数组为null
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 是否有任何(方便的)方法可以在 C++11 "foreach"语句中检索当前迭代 #?