gpt4 book ai didi

c++ - 如何在迭代数组时对相同元素进行分组(例如 :{1, 2,2,2,1,1,1,3,3,2,2})?

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:24 25 4
gpt4 key购买 nike

例如,我有数组 {1,2,2,2,1,1,1,3,3,2,2},我想迭代它以打印类似的内容:

1 
2 2 2
1 1 1
3 3
2 2

所以我创建了一个类似的程序(从实际代码中简化而来):

int numArray[]={1,2,2,2,1,1,1,3,3,2,2}; //in real code it may be something like MyObject myObjectArray[]
vector<int> store;
for(int i=0;i<sizeof(numArray)/sizeof(int);i++){
//in real case it may check store.back()!=myObject.getNum()
if(store.size()>0 && store.back()!=numArray[i]){
for(int j=0;j<store.size();j++){
printf("%d ",store[j]);//(it may be someFunction(store[j]) in real cases)
}
printf("\n"); //(it may be changePattern() in real case)
store.clear();
}
store.push_back(numArray[i]);
}
for(int j=0;j<store.size();j++){
printf("%d ",store[j]);
}
printf("\n");

但是这个程序不是很容易维护,首先,它需要额外的 vector 来复制和存储一些临时结果,另外,这段代码:

for(int j=0;j<store.size();j++){
printf("%d ",store[j]);
}
printf("\n");

需要出现在for循环的内外。

是否可以使用一些简单的 for 循环,例如:

for(int i=0;i<sizeof(numArray)/sizeof(int);i++){
if(//something like numArray[i]!=numArray[i-1]){
for(//start from last changed element to current element){
}
}
printf("\n");
}

哪个不需要存储临时结果,不需要重复代码?

最佳答案

我很惊讶到目前为止没有一个答案尝试使用标准库。

函数std::adjacent_find用于查找序列中相同的两个连续项目;我们想做相反的事情,即在一个序列中找到两个不同的项目。这就像将否定谓词(即 std::not_equal_to)传递给 adjacent_find 一样简单。

使用这个,完整的解决方案是这样的:

constexpr int numArray[] = {1,2,2,2,1,1,1,3,3,2,2};

// Initialise the iterator
auto first = std::cbegin(numArray);

while (first != std::cend(numArray)) {
// adjacent_find returns the *first* of each pair it finds....
auto iter = std::adjacent_find(first, std::cend(numArray),
std::not_equal_to<>{});
// ...but we want the second member of each pair, as long as that's
// not past the end of the array
if (iter != std::cend(numArray)) {
iter = std::next(iter);
}

// Print the array slice, followed by a newline
std::copy(first, iter, std::ostream_iterator<int>{std::cout});
std::cout << "\n";

// Move on
first = iter;
}

这打印

1
222
111
33
22

根据需要

关于c++ - 如何在迭代数组时对相同元素进行分组(例如 :{1, 2,2,2,1,1,1,3,3,2,2})?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36122344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com