【问题标题】:want to add an integer in all the indexes of the integer array想在整数数组的所有索引中添加一个整数
【发布时间】:2010-12-26 17:26:03
【问题描述】:

我想在数组的所有索引中添加一个整数。不使用循环。在单个语句中。

int a[4]={4,4,4,4}; 我想在所有索引中添加 1.. 所以输出是 cout

输出:_ 5 5 5 5

我很感谢大家..

【问题讨论】:

  • 不使用 loop .in single ststement” - 听起来像是人为的要求。你到底想做什么?
  • 为什么要这样做?这听起来像家庭作业......
  • 我没有在一行中使用循环就做到了,请参阅下面的答案

标签: c++ arrays


【解决方案1】:
#include <functional>
#include <algorithm>

int main()
{
    int a[] = {1, 2, 3, 4};

    std::transform(a, a + sizeof(a) / sizeof(a[0]), a, std::bind1st(std::plus<int>(), 1));
}

【讨论】:

  • 这是一种混淆循环的迂回方式。 +1!
  • OP 的问题放在一边,什么时候,everever 会在循环中发现这在实践中很有用? :P
  • @marcog,嗯,没错,在 C++ 中,最好在其他语言中使用循环来处理琐碎的任务 :) 尽管这是很自然的(即在 F# 中,这将是 a |&gt; Array.map ((+) 1))。
  • @marcog:我发现我很少真正编写循环来做这种事情。 std::algorithms 之一几乎总是我的选择。因为它们是正确简洁的,并且往往由编译器高度优化。
  • @marcog:您使用某项功能的程度与其看起来的晦涩程度之间存在直接关系。我敢打赌,随着 lambdas 添加到语言中,你会发现这种类型的解决方案很常见,如果表达方式不同:std::transform( a, a+4, a, []( int x ) { return x+1; } );
【解决方案2】:

另一种可能性是使用std::valarray

int aa[] = {4, 4, 4, 4};

std::valarray<int> a(aa, 4);

a += 1;

我不能说我真的推荐这个,但它确实有效。

【讨论】:

  • 你为什么要给出一个你不推荐的答案?
  • @Fred Nurk:因为我认为这是一个愚蠢问题的最佳答案。
  • 为什么愚蠢的问题应该得到任何答案?开玩笑的答案(尽管你的答案并不像我见过的那么糟糕)很有趣,但噪音很大,尤其是在稍后给出澄清或有人弄清楚 OP 的真正含义的情况下。
  • 也许不同的策略会说明我想说的:“我不能说我真的会推荐这个,但它确实有效。”与“我不能说我真的建议用武士刀刺伤自己,但它确实可以让你快速进入急诊室看看牙痛”。这不是我会给任何人的建议,除了开玩笑。我从来没有想过你是一个纯粹为了消遣而给出答案的人。
  • 笑话回答人们赞成“这是一种混淆循环的迂回方式。+1!” (该评论本身目前为+2)只是取笑OP和问题(我确实说过你的问题并不像我见过的那么糟糕,但我也相信它是真诚地提交的,不像真的坏的)。也许OP的指点和笑声是应得的,也许不是,但我认为这不是一个好的答案。
【解决方案3】:

如何递归地做:

template<typename Itr>
void inc(Itr itr, Itr end)
{
   if (itr == end) return;
   ++(*itr);
   inc(++itr,end);
}

int main()
{
   int a[4]={4,4,4,4}; 
   inc(a,a + 4);
   return 0;
}

这是尾递归的,所以一个体面的编译器应该把它转换成一个循环。

【讨论】:

    【解决方案4】:

    SSE2 解决方案(使用内在函数):

    __m128i v1 = _mm_set_epi32(4, 4, 4, 4);
    __m128i v2 = _mm_set_epi32(1, 1, 1, 1);
    __m128i v3 = _mm_add_epi32(v1, v2);
    

    【讨论】:

      【解决方案5】:
      #include <iostream>
      using namespace std;
      int main()
      {
      int a[4]={4,4,4,4};
      a[0]++,a[1]++,a[2]++,a[3]++;
      return 0;
      }
      

      【讨论】:

      • 对于那些投了反对票的人,请解释原因。另请注意,在 C++ 中,由 , 分隔的两个操作不被视为两个单独的操作。, 运算符将其链接在一起。虽然这可能不是最好看的解决方案,而且绝对不可扩展,但它非常适合这个问题
      • 它们是单独的操作,而不是单独的语句,这对 OP 很重要(出于未知原因)。
      【解决方案6】:

      如果您的数组只能有 4 个元素,您也许可以使用 SSE2 指令集扩展的 PADDD 指令。我从来没有使用过这个,所以我不能提供更多的细节。

      This 的问题可能会给你更多的提示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多