如何解决我为什么得到:“结束后无法寻求矢量迭代器”
所以我正在尝试使用c ++解决josephus问题
第一个输入是人数,第二个是杀死下一个人的位置
我收到运行时错误,因为:“结束后无法寻找向量迭代器”
代码:
// josephus.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int people = 0,pos = 0;
cin >> people >> pos;
vector<int> vp;
for (int i = 1; i <= people; ++i)
{
vp.push_back(i);
}
int index = 0;
while (vp.size() != 1)
{
index += pos - 1;
if (index >= vp.size())
{
index -= vp.size();
}
vp.erase(vp.begin() + index);
}
cout << vp[0] << endl;
return 0;
}
对于输入数据10 3(人= 10,pos = 3),这没有什么错误,这很有趣。它给出了正确的答案4。
但是对于输入94 31(人= 94,pos = 31),这给了我运行时错误。 我认为擦除功能出现问题。
我已经尽力了。任何帮助表示赞赏。
解决方法
正如注释1201ProgramAlarm所提到的那样,@Bean
public Flux<RabbitEventPublishEnvelope> masterFlux(
Queue eventQueue,ObjectMapper objectMapper,MessageListenerContainerFactory messageListenerContainerFactory) {
log.info("Create a listener for the topic queue: '{}'",eventQueue.getName());
MessageListenerContainer mlc = messageListenerContainerFactory
.createDirectMessageListenerContainer(eventQueue.getName());
log.info("Define the master Flux for event subscriptions on queue '{}'",eventQueue.getName());
Flux<RabbitEventPublishEnvelope> masterFlux = Flux.create(emitter -> {
mlc.setupMessageListener(m -> {
RabbitEventPublishEnvelope payload = null;
try {
log.info("Creating payload");
payload = objectMapper.readValue(m.getBody(),RabbitEventPublishEnvelope.class);
} catch (IOException e) {
log.error("Failed to parse RabbitEventPublishEnvelope:\n{}",m.getBody());
throw new RuntimeException("Failed to parse RabbitEventPublishEnvelope",e);
} catch (Exception e) {
log.error("Unhandled exception in Flux.create(): {}",e.getMessage(),e);
}
log.info("Emitting payload");
emitter.next(payload);
});
emitter.onRequest(v -> {
log.info("MLC starting");
mlc.start();
log.info("Start recipe event subscription");
});
emitter.onDispose(() -> {
// WARNING: DO NOT issue `mlc.stop();` here or it will cause responses to hang.
// The main reason this callback handler is implemented is to document what will break our implementation.
log.info("Done with recipe event subscription");
});
});
log.info("Created master flux for queue = '{}'",eventQueue.getName());
return masterFlux
.log("Publishing flux")
.publish()
.autoConnect()
.timeout(Duration.ofMillis(10000))
.doOnError(error -> log.error("Unhandled exception in masterFlux(): {}",error.getMessage(),error))
.log("Auto connection successful");
}
可以大于index
,这意味着当您尝试擦除vp.size()
时,它将失败,因为{{ 1}}。 vp.begin() + index
和vp.end() - 1
是迭代器,因此当您尝试在结束后(vp.begin()
)寻找迭代器时,它并不能完全告诉您。
程序具有未定义的行为,因为根据序列容器的要求,成员函数erase
的参数应为有效的 dereferenceable 迭代器。但是由于这个说法
index += pos - 1;
index
的值可以大于或等于表达式2 * ( current size of the vector)
的值。
在这种情况下,在下一个if语句中
if (index >= vp.size())
{
index -= vp.size();
}
index
的值将大于或等于vp.size()
的值。
此通话结果
vp.erase(vp.begin() + index);
将不使用有效的可引用迭代器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。