使用向量中每个对象的函数

Using a function from each object in a vector

本文关键字:对象 函数 向量      更新时间:2023-10-16

Im正在编码一台谜机,在使用矢量中的元素时遇到了问题,只得到了一个分段错误。我需要在单个字符上使用向量中每个转子的函数,在迭代器移动时转换字符,在列表中向前移动一次,向后移动一次。我已经注释掉了其他转换来隔离问题。

机器.cpp

#include "Machine.h"
using namespace std;
Machine::Machine(const vector<Rotor>& rots, const Plugboard & pb)
    : rotors(rots), plugboard(pb) {}
// give c's alphabet index
int Machine::getPosition(char c) {
    if (c >= 'A' && c <= 'Z') {
        return c - 'A';
    } else {
        cout << "not an accepted character";
        return -1;
    }
}
// give letter at index i in alphabet
char Machine::atPosition(int i) {
    assert(i >= 0 && i <= 25);
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ" [i];
}
char Machine::encode(char c) {
    assert(c >= 'A' && c <= 'Z');
    // plugboard
    // c = plugboard.getMatch(c);
    // forward pass through rotors
    for (std::vector<Rotor>::iterator it = rotors.begin(); it != rotors.end(); ++it) {
        c = it->process(c);
    }
    // reflector
    // c = Reflector::reflect(c);
    // backwards pass through rotors
    for (std::vector<Rotor>::iterator it = rotors.end(); it != rotors.begin(); --it) {
        c = it->processInverse(c);
    }
    return c;
}

我的主要功能的相关调用部分:

  Rotor rot1(argv[1]);
  Plugboard pb1(argv[2]);
  vector<Rotor> rotors(1, rot1);
  Machine machine(rotors, pb1);
  machine.encode('A');

您错误地向后迭代。rotors.end()指向的迭代器超过了向量的末尾,它不是一个有效的对象。。。因此,对其调用函数是未定义的行为。

如果你想向后迭代,你必须使用反向迭代器:

for (std::vector<Rotor>::reverse_iterator it = rotors.rbegin();
    it != rotors.rend(); ++it) {
    c = it->processInverse(c);
}