#include <iostream>#include <vector>class Josephus {private: int n; // 总人数 int m; // 报数到m的人出圈 std::vector<bool> alive; // 存储每个人是否还活着 int current; // 当前正在报数的人的索引public: Josephus(int n, int m) : n(n), m(m), alive(n, true), current(-1) {} void next_alive() { int count = 0; while (count < m) { current = (current + 1) % n; if (alive[current]) { count++; } } } void run() { for (int i = 0; i < n - 1; i++) { next_alive(); alive[current] = false; std::cout << "第" << current + 1 << "个人出圈了" << std::endl; } std::cout << "最后剩下的人是第" << alive.find(true) + 1 << "个人" << std::endl; }};int main() { int n = 10; int m = 3; Josephus j(n, m); j.run(); return 0;}
时间: 2024-03-09 13:50:30 浏览: 68
这段代码的问题在于`alive`是一个`std::vector<bool>`类型的容器,而`find`函数并不适用于这种容器类型。具体来说,`std::vector<bool>`是一个特化的容器类型,它并不是一个标准的容器类型,因此它可能不支持所有的STL算法和函数。
在这种情况下,你可以使用其他方法来找到`alive`中值为`true`的元素。例如,你可以使用`std::find_if`算法来查找第一个满足特定条件的元素。下面是一个修改后的代码示例:
```
#include <iostream>
#include <vector>
#include <algorithm>
class Josephus {
private:
int n; // 总人数
int m; // 报数到m的人出圈
std::vector<bool> alive; // 存储每个人是否还活着
int current; // 当前正在报数的人的索引
public:
Josephus(int n, int m) : n(n), m(m), alive(n, true), current(-1) {}
void next_alive() {
int count = 0;
while (count < m) {
current = (current + 1) % n;
if (alive[current]) {
count++;
}
}
}
void run() {
for (int i = 0; i < n - 1; i++) {
next_alive();
alive[current] = false;
std::cout << "第" << current + 1 << "个人出圈了" << std::endl;
}
auto it = std::find_if(alive.begin(), alive.end(), [](bool v) { return v; });
int index = std::distance(alive.begin(), it);
std::cout << "最后剩下的人是第" << index + 1 << "个人" << std::endl;
}
};
int main() {
int n = 10;
int m = 3;
Josephus j(n, m);
j.run();
return 0;
}
```
在这个修改后的代码中,我们使用了`std::find_if`算法来查找第一个值为`true`的元素,并使用`std::distance`函数来计算该元素在容器中的位置。这样就能够找到最后剩下的人的索引了。
阅读全文