在嵌套循环/循环不变量中检查一次
Check something once in nested loop / loop-invariants
在嵌套循环中每次迭代只做一次的最聪明的方法是什么?我无法取出不变部分,因为外循环非常复杂。这是我的C++示例:
void foo::bar() {
if(oldCycle == tree.cycle) {
doSomething();
oldCycle++;
}
}
在tree.cycle递增之前,经常调用此方法。oldCycle是foo 的私有成员变量
claas foo {
public: ...
private:
int oldCycle;
};
编译器会优化这个代码吗?还是每次迭代都会运行if检查?
编辑:这里类似于请求的带有循环的代码:第一个循环是在mexFunction()方法中,该算法在matlab中启动并调用mexFunction。
void mexFunction(...) {
for( tree.cycle = 0; tree.cycle<maxIt; tree.cycle++ ) {
foo->startfoo();
}
}
这是另一个循环:
void foo::startfoo() {
for(tree.cur_it = 0; tree.cur_it <=39; tree.cur_it++ ) {
bar();
}
}
对于一般情况,您无法真正优化它,因为您需要以某种方式从集合中删除特殊情况。
但是,对于特殊处理第一个元素的特殊情况(例如,当将带有delimiters的范围打印为"1, 2, 3"
时),可以使用Knuth的"环半":
Naive循环:
for (unsigned int i = 0; i != values.size(); ++i)
{
if (i != 0) { std::cout << ", "; }
std::cout << values[i];
}
循环半:
if (!values.empty())
{
for (unsigned int i = 0; ; )
{
std::cout << values[i];
++i;
if (i == values.size()) { break; }
std::cout << ", ";
}
}
后一种构造更为复杂,但省去了大部分错误的检查i != 0
。
也就是说,即使你以天真的方式编写代码,一个好的编译器也会进行部分展开,这是很有可能的。
对于简单的情况,我更喜欢这种方法。
if ( ! values.empty())
{
std::cout << values[0];
for (size_t z = 1; z < values.size(); z++)
{
std::cout << ", " << values[z];
}
}
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 我可以一次检查一小堆布尔值吗?
- 我如何检查一次测试中有多少个``期望_*`呼叫失败
- 是一个 for 循环,最终甚至不会运行一次,就像调用 if 语句以首先检查大小一样快
- 检查文件在n分钟内存在一次c++
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 在嵌套循环/循环不变量中检查一次
- 我怎样才能进行倒计时,每秒检查一次是否输入了某些内容,而不会中断
- 我需要一个 std 函数来检查有多少元素在向量中恰好出现一次
- 我可以检查哪些函数模板至少实例化过一次吗
- 是否允许 vector::insert 只保留一次,避免进一步的容量检查
- c++如何每10秒检查一次时间
- 处理器多久检查一次while循环条件
- "Peek ahead"检查下一次对getline(file,line)的调用是否会返回false - 而不实际调用它,即不消耗该行