gpt4 book ai didi

c++ - 通过元素原始位置的奇偶校验来稳定分区std::vector

转载 作者:行者123 更新时间:2023-12-01 15:11:02 26 4
gpt4 key购买 nike

我想通过容器中元素原始索引的奇偶校验对std::vector进行分区。换句话说,我想将其分为两半:第一个包含所有偶数索引元素,第二个包含所有奇数索引元素。

元素之间的排序关系无关紧要,只有原始 vector 中的位置才重要。

我想使用标准算法和lambdas(最好是在原位)来实现这种效果。我可以使用常规的for循环来做到这一点。



让我们假设我们有一个元素a b c d e f的 vector 。所需的分区是a c e b d f。第一个(a),第三个(c)和第五个(e)移到前面,而第二个(b),第四个(d)和第六个(f)移到后面。

我的尝试

我有一个与此对象相似的对象:

struct T {
int x;
};

我能够按如下所示的字段值对其进行分区:

std::vector<T> ts {{1}, {2}, {4}, {3}, {6}, {5}};
auto predicate = [](const T& t) {
return t.x % 2 == 1;
};
std::stable_partition(ts.begin(), ts.end(), predicate);

结果是 1 3 5 2 4 6。我希望分区返回 1 4 6 2 3 5

我试图将 predicate定义为

auto predicate = [](const std::vector<T>::const_iterator& t)
return t->x % 2 == 1;
};

但是它不能编译,并且显然没有任何意义。

为了说明我的问题,我编写了一个 for循环来执行此分区,尽管这种方法不是很稳定。

for (auto i = ts.begin() + 1, j = ts.begin() + 2; j != ts.end(); i += 1, j += 2) {
std::swap(*i, *j);
}

概要

是否可以使用 std算法实现它,还是我需要求助于标准循环?

最佳答案

在c++ 11中,使用计数器作为索引来验证它是偶数还是奇数。

#include <iostream>
#include <vector>

struct T {
int x;
};

int main()
{
std::vector<T> ts {{1}, {2}, {4}, {3}, {6}, {5}};
int counter =0;
auto predicate = [&counter]() {
++counter;
return (counter % 2 == 1);
};
std::stable_partition(ts.begin(), ts.end(), predicate);

for(auto i: ts)
std::cout << i.x << ", ";

}

关于c++ - 通过元素原始位置的奇偶校验来稳定分区std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59948444/

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