我为什么得到:“结束后无法寻求矢量迭代器”

问题描述

所以我正在尝试使用c ++解决@L_502_0@问题

一个输入是人数,第二个是杀死下一个人的位置

我收到运行时错误,因为:“结束后无法寻找向量迭代器”

代码

// 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() + indexvp.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);

将不使用有效的可引用迭代器。