Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “如何分组”;不同于;迭代数组时的元素(例如:{1,2,2,1,3,3,3,2,1,1}到{1,2}{2,1,3}{3}{3,2,1}{1})?_C++_Arrays_Algorithm_For Loop_Iterator - Fatal编程技术网

C++ “如何分组”;不同于;迭代数组时的元素(例如:{1,2,2,1,3,3,3,2,1,1}到{1,2}{2,1,3}{3}{3,2,1}{1})?

C++ “如何分组”;不同于;迭代数组时的元素(例如:{1,2,2,1,3,3,3,2,1,1}到{1,2}{2,1,3}{3}{3,2,1}{1})?,c++,arrays,algorithm,for-loop,iterator,C++,Arrays,Algorithm,For Loop,Iterator,我有一个数组 int a[]={1,2,2,1,3,3,3,2,1,1}; 例如,如果我想在迭代时对相同的元素进行分组(不需要任何临时变量或数组来存储或复制元素),则在迭代时在一行中打印相同的元素: 1 2 2 1 3 3 3 2 1 1 我可以使用for循环,如果条件如下: #include <stdio.h> int main(){ int a[]={1,2,2,1,3,3,3,2,1,1}; for(int i=0,j=0;i<sizeof

我有一个数组

int a[]={1,2,2,1,3,3,3,2,1,1};
例如,如果我想在迭代时对相同的元素进行分组(不需要任何临时变量或数组来存储或复制元素),则在迭代时在一行中打印相同的元素:

1 
2 2 
1 
3 3 3 
2 
1 1 
我可以使用for循环,如果条件如下:

#include <stdio.h>
int main(){
    int a[]={1,2,2,1,3,3,3,2,1,1};
    for(int i=0,j=0;i<sizeof(a)/sizeof(int);i++){
        if(i==sizeof(a)/sizeof(int)-1 || a[i]!=a[i+1]){
            for(;j<=i;j++){
                printf("%d ",a[j]);
            }
            printf("\n");
        }
    }
    return 0;
}
是否可能有类似于以前版本的解决方案

for(int i=0,j=0;i<sizeof(a)/sizeof(int);i++){
    if(...){
        for(;j<=i;j++){
            printf("%d ",a[j]);
        }
        printf("\n");
    }
}
for(inti=0,j=0;i
inta[]={1,2,2,1,3,3,2,1,1};
int-prev=a[0];
bool first=false;
printf(“%d”,上一页);
对于(int i=1;i
在数组的一次迭代中,无需使用任何临时变量即可轻松解决问题

其主要思想是在打印当前索引处的元素之前先查看后面的内容,如果它们都匹配,那么我们必须将当前索引处的元素放在新行上,就是这样

打印第一个元素,循环从第二个元素开始,因为第一个元素后面没有元素

使用这一基本思想,代码如下:

int a[] = {1,2,2,1,3,3,3,2,1,1};
//print the first element
printf("%d ",a[0]);
for (int i=1; i < sizeof(a) / sizeof(int); ++i) {
 //check if the element at current index matches previous element.
 if(a[i] == a[i-1]) 
  printf("\n%d ",arr[i]);
 else printf("%d ",arr[i]);

}
inta[]={1,2,2,1,3,3,2,1,1};
//打印第一个元素
printf(“%d”,a[0]);
对于(int i=1;i
这只是一个乞求解决的问题

对于不同元素的分组,您可以执行以下操作:

auto i = cbegin(a);

for (auto j = adjacent_find(cbegin(a), cend(a)); j != cend(a); i = j, j = adjacent_find(i, cend(a))) {
    copy(i, ++j, ostream_iterator<decltype(*cbegin(a))>(cout, " "));
    cout << endl;
}
copy(i, cend(a), ostream_iterator<decltype(*cbegin(a))>(cout, " "));


注:
decltype(*cbegin(a))
可能看起来有点复杂,它可以用
int
替换,但是,您将失去灵活性。如果您任意地想将
a
声明为
字符串,甚至是

解决此问题所做的任何事情都具有时间复杂性O(N^2),则此代码不需要更改。但是可以用时间复杂度O(N)来解决这个问题,这在前面的答案中解释得很好。但是我认为您只需要通过更改
if(…)
来解决这个问题。我在这里找到了一个解决方案。用以下代码替换该行

if( (i<sizeof(a)/sizeof(int) && a[i]==a[i+1]) || i==sizeof(a)/sizeof(int)-1 )

if((如果一个元素与下一个元素相同,请打印一个
'\n'
。最后要小心。(或者反过来,检查它是否与前一个相同,并在开始时小心)@如果您不想使用任何临时变量,请参见我的解决方案。@ TimeGeeleSeEn<代码> int第一个/C++ >:我宁愿在C++中使用<代码> BoOL <代码>。@ MeleBiUS基于使用<代码> Prtff<代码>,而不是单个代码> STD::/Cord>。,但OP对我来说很有趣,所以我尝试了一个答案。我几乎喜欢这样,只是它总是在每行上打印一个额外的空格(不是世界末日)。@TimBiegeleisen尝试将第一个格式说明符更改为
%d“
,将循环中的其他格式说明符更改为
”\n%d“
%d”
,或者使用
cout
auto i = cbegin(a);

for (auto j = adjacent_find(cbegin(a), cend(a)); j != cend(a); i = j, j = adjacent_find(i, cend(a))) {
    copy(i, ++j, ostream_iterator<decltype(*cbegin(a))>(cout, " "));
    cout << endl;
}
copy(i, cend(a), ostream_iterator<decltype(*cbegin(a))>(cout, " "));
auto i = cbegin(a);

for (auto j = adjacent_find(cbegin(a), cend(a), not_equal_to<decltype(*cbegin(a))>()); j != cend(a); i = j, j = adjacent_find(i, cend(a), not_equal_to<decltype(*cbegin(a))>())) {
    copy(i, ++j, ostream_iterator<decltype(*cbegin(a))>(cout, " "));
    cout << endl;
}
copy(i, cend(a), ostream_iterator<decltype(*cbegin(a))>(cout, " "));
if( (i<sizeof(a)/sizeof(int) && a[i]==a[i+1]) || i==sizeof(a)/sizeof(int)-1 )