std::stable_partition(windspeed_datas1.begin(), windspeed_datas1.end(), [](double x) { return x != 0; }); 使用qt4 写出其他做法
时间: 2024-03-10 12:49:38 浏览: 13
在Qt4中,可以使用QMutableListIterator来实现stable_partition的功能。具体实现如下:
```cpp
QMutableListIterator<double> iter(windspeed_datas1);
while (iter.hasNext()) {
if (iter.next() == 0) {
iter.remove();
}
}
```
这个做法的思路是遍历windspeed_datas1中的每一个元素,如果元素为0,则使用QMutableListIterator的remove函数将其删除。由于QMutableListIterator是一个双向迭代器,因此可以保证删除元素时不会影响其他元素的位置,从而实现stable_partition的效果。
相关问题
std::stable_partition(windspeed_datas2.begin(), windspeed_datas2.end(), [](double x) { return x != 0; }); windspeed_datas2.erase(std::remove(windspeed_datas2.begin(), windspeed_datas2.end(), 0), windspeed_datas2.end()); 用Qt4写出另一种办法
可以使用Qt4提供的STL容器类QVector来代替std::vector,并使用QMutableVectorIterator来操作容器元素。代码如下所示:
```
QVector<double> windspeed_datas2;
// 填充 windspeed_datas2 容器
QMutableVectorIterator<double> it(windspeed_datas2);
while (it.hasNext()) {
if (qFuzzyCompare(it.next(), 0.0)) {
it.remove();
}
}
std::stable_partition(windspeed_datas2.begin(), windspeed_datas2.end(), [](double x) { return x != 0; });
```
在上面的代码中,QMutableVectorIterator提供了操作容器元素的迭代器,通过调用remove()函数来删除元素。qFuzzyCompare()函数用于比较两个浮点数是否相等,因为浮点数之间的精度问题可能会导致比较结果出现误差。最后,使用std::stable_partition()函数来把非零元素移到容器的前面。
优化代码 std::map<int, int> my_map; // 假设 my_map 是要分组的 std::map for(int i=0;i<1234;i++){ my_map[i] = i*2; } const int max_group_size = 200; // 每组最多有 200 个元素 // 将 std::map 转换为 std::vector std::vector<std::pair<int, int>> my_vector(my_map.begin(), my_map.end()); // 使用 std::partition 算法将元素分组 auto partition_iter = std::begin(my_vector); while (partition_iter != std::end(my_vector)) { auto next_partition_iter = std::next(partition_iter,max_group_size); if(next_partition_iter > std::end(my_vector)){ next_partition_iter = std::end(my_vector); } for(auto iter = partition_iter;iter != next_partition_iter;++iter){ std::cout << iter->first << " --> " << iter->second << std::endl; } std::cout << "======group end======" << std::endl; partition_iter = next_partition_iter; }
这段代码看起来已经很不错了,但是还有一些可以优化的地方:
1. 在 for 循环中使用 emplace_back() 而不是直接赋值,可以避免多余的拷贝操作。
2. 在 std::partition 中使用 lambda 表达式,可以避免定义额外的函数对象。
3. 在 std::next 中使用 std::min 可以避免超出边界的问题。
下面是优化后的代码:
```
std::map<int, int> my_map;
for (int i = 0; i < 1234; i++) {
my_map.emplace(i, i * 2);
}
const int max_group_size = 200;
std::vector<std::pair<int, int>> my_vector;
my_vector.reserve(my_map.size());
for (const auto& pair : my_map) {
my_vector.emplace_back(pair.first, pair.second);
}
auto partition_iter = std::begin(my_vector);
while (partition_iter != std::end(my_vector)) {
const auto next_partition_iter = std::next(partition_iter, std::min(max_group_size, static_cast<int>(std::distance(partition_iter, std::end(my_vector)))));
std::for_each(partition_iter, next_partition_iter, [](const auto& pair) {
std::cout << pair.first << " --> " << pair.second << '\n';
});
std::cout << "======group end======" << '\n';
partition_iter = next_partition_iter;
}
```
这样做的好处是减少了不必要的拷贝和函数调用,使代码更加优雅和高效。