如果特定长度的数组中的所有元素都为正,我编写了一个返回伪布尔值的函数。我觉得这可能效率低下:
int all_positive(int a[], unsigned int alen)
{
for(int i = 0 ; i < alen ; i++)
{
if(a[i] < 0)
{
return 0;
break;
}
else if(i == alen - 1)
{
return 1;
}
}
}
答案 0 :(得分:2)
你可以清理它并缩短它:
int all_positive(int a[], unsigned int alen)
{
for(int i = 0 ; i < alen ; i++)
if(a[i] < 0)
return 0;
return 1;
}
我不确定这是否会更快。您的优化器也可以这样做。
答案 1 :(得分:2)
int all_positive(int a[], unsigned int alen)
{
unsigned i;
for (i = 0; i < alen && a[i] > 0; ++i)
;
return i == alen;
}
您可以稍微整理一下代码,以减少分支。同时将i++
替换为++i
,以便不创建临时对象。
答案 2 :(得分:2)
如果特定长度的数组中的所有元素都是正数。
(OP&#39的代码暗示0被认为是正面的。)
代码可以<tr style="cursor:pointer;" id="235005" class="showOffre setPushStat ajax" href="menu_detail_offre.php?checksum=IM-O-58cf724c03e64" data-divdest="detail_235005" data-godiv="detail_235005" data-pushstat_url="!O-235005">
<td align="left" style="vertical-align:middle"><img src="/photos.immobilier.nc//gw/2017/4/_thumbs/bb3dfed8-66f6-4a6b-939a-a47b70c998ba.jpeg" width="100"></td>
<td nowrap="" align="left" style="vertical-align:middle"> 235005</td>
<td align="left" style="vertical-align:middle">Vente</td>
<td align="left" style="vertical-align:middle"><img src="http://immobilier.nc/images/part_promobat_mini.jpg" style="display: none !important;"> </td>
<td align="left" style="vertical-align:middle">Appartement</td>
<td align="left" style="vertical-align:middle">F3</td>
<td align="left" style="vertical-align:middle">Nouméa</td>
<td align="left" style="vertical-align:middle">Ouémo</td>
<td nowrap="" align="left" style="vertical-align:middle">35.278 U</td>
<td align="left" style="vertical-align:middle">17/04/2017</td>
</tr>
将所有值放在一起。所有代码都在寻找一个符号位。
or
没有退出的早期否定,但是一个简单的循环。
适用于2的补充系统。对于其他稀有平台,这取决于OP如何处理int all_positive1(const int a[], size_t alen) {
int y = 0;
while (alen--) {
y |= a[alen];
}
return y >= 0;
}
提前退出
-0
经典破解它在一端放置一个已知的否定。当然,int all_positive2(const int a[], size_t alen) {
while (alen--) {
if (a[alen] < 0) return 0;
}
return 1;
}
不能是int a[]
。与@technosaurus
const
答案 3 :(得分:1)
您可以移除else if
部分,并在循环之外执行此操作。
If (i == alen) return 1;
或者
return 1;
这样你就可以避免在每个循环中检查条件。除此之外,我没有看到任何其他可能的改进。
修改:此外,您不需要break;
,因为您使用return;
答案 4 :(得分:1)
int
。返回bool
(自C99开始......现在是2017年!)unsigned int alen
vs(signed
)int i
...不是个好主意!保持一致,并为长度和索引使用 Designed 类型:size_t
else if
是不必要的。只需在函数末尾的循环外放置return true;
即可。这也会使编译器静默警告你“控制到达非空函数的结束”。您确实已启用所有警告,是吗?int const * a
(也可以摆脱那些隐藏指针的混淆语法糖)。break
是多余的。 那就是说,你正在对那个数组进行一次传递,只看每个元素。有很多关于如何编写这个简单循环的变体,并且所有变体都可能几乎一样快。如果你正在寻找一个性能瓶颈,那么这可能是(*)不是搜索的地方(否则你需要尝试获取SSE或 - 对于大型数组 - 多个线程可以解决这个问题)
我的看法:
bool all_positive(int const * array, size_t length) {
for (size_t i = 0; i < length; ++i) {
if (array[i] < 0) {
return false;
}
}
return true;
}
(*)确保您需要个人资料您的代码。这通常通过使用特殊编译器开关编译代码来完成,这样运行编译的程序就会生成一个配置文件,其中包含程序花费大部分时间的代码。 如果事实证明上面的循环是实际的瓶颈,那么按照评论中的建议尝试去掉它可能是有意义的,只需跟踪该数组中负面元素的数量您插入/修改值。
答案 5 :(得分:0)
由于您没有指定输入arrray必须是const,所以只需在末尾留下填充并执行此操作。
static inline _Bool all_positive(int *a, size_t alen){
a[alen]=-1;
size_t i = 0;
while (a[i]>=0){
++i;
}
return i!=alen;
}
如果您无法使用填充,则可以保存并恢复最后一项
答案 6 :(得分:0)
可以简化一下。 检查此代码,它将提供相同的输出
int all_positive(int a[], unsigned int alen)
{
for(int i = 0 ; i < alen ; i++)
{
if(a[i] < 0)
return 0;
}
return 1;
}
如果你可以使用bool而不是int那么它会更容易
bool all_positive(int a[], unsigned int alen)
{
for(int i = 0 ; i < alen ; i++)
{
if(a[i] < 0)
return false;
}
return true;
}
答案 7 :(得分:-2)
你的profiler告诉你这里有问题吗?当您从一个元素移动到下一个元素时,可能指针实现可能更快。
第二次检查似乎很奇怪。我可能会像这样重写它。
int all_positive(int a[], unsigned int alen)
{
if (alen > 0)
{
for(int i = 0 ; i < alen - 1 ; i++)
{
if (a[i] < 0)
{
return 0;
break;
}
else
{
/* Since this is positive we can just keep looking */
}
}
}
else
{
/* Empty arrays imply all are positive */
}
return 1;
}
还有很多其他事情可以做 我建议您使用分析器来确定程序运行缓慢的位置。这是一项有用的技能。