第二个迭代器覆盖第一个迭代器[关闭]

Posted

技术标签:

【中文标题】第二个迭代器覆盖第一个迭代器[关闭]【英文标题】:Second iterator overwrites first iterator [closed] 【发布时间】:2019-04-26 10:37:35 【问题描述】:

我(还)不是 C++ 的优秀编码员,我正在完成一本培训书中的一些任务,我在其中编写了一个 IP 地址类。在这个类中,我有一个私有的vector<string>,它保存了地址的单个块。 我重载了== operator,在这里我交出了我想通过引用进行比较的对象。

我有一个vector::iterator 用于this-object。我现在遇到的问题是我为compareTo-object 定义的第二个迭代器覆盖了第一个迭代器。

我已经找了几个小时的错误。请找到附加的代码 sn-p 及其输出。有任何想法吗?或者这是 C++ 的预期行为?我在 MacOS 上使用 CLANG 编译器。

来自 IPv4 类

class IPv4

private:
string adress;
vector<string> IPBlocksOfAdress;

bool testIP();
vector<string> splitString(const string stringToSplit, char delimiter = '.');

public:
IPv4::IPv4(const string &inputAdress)

    setAdress(inputAdress);


bool IPv4::testIP()

    bool isIP = true;

    for (vector<string>::iterator blocksOfAdressIterator = IPBlocksOfAdress.begin();
     blocksOfAdressIterator != IPBlocksOfAdress.end(); blocksOfAdressIterator++) 

        if (stoi(*blocksOfAdressIterator) > 255 || stoi(*blocksOfAdressIterator) < 0) 
        isIP = false;
        
    
return isIP;


vector<string> IPv4::splitString(const string stringToSplit, char delimiter) 

    vector<string> blocksOfAdress;
    stringstream stringToSplitStream(stringToSplit);
    string blockOfAdress = "";
    while (getline(stringToSplitStream, blockOfAdress, delimiter)) 
        blocksOfAdress.push_back(blockOfAdress);
    
    return blocksOfAdress;


string IPv4::getAdress() const

    if (adress != "0.0.0.0") 
        return adress;
     else 
        return "Error, Adress not set.";
    


vector<string> IPv4::getAdressBlocks() const

    return IPBlocksOfAdress;


void IPv4::setAdress(const string &inputAdress)

    IPBlocksOfAdress = splitString(inputAdress,'.');
    if (testIP()) 
        cout << "Neue IP Addresse: " << inputAdress << endl;
        adress = inputAdress;
     else 
        cout << "Die Eingabe entspricht nicht dem IPv4-Format. Setze Adresse auf 0.0.0.0" << endl;
        adress = "0.0.0.0";
        IPBlocksOfAdress = splitString(adress,'.');
    


bool IPv4::operator == (const IPv4 &compareTo) const

    cout << " ... in operator == ..." << endl;

    bool isIdenticalThis = true;

    cout << "this Adress: " << this->getAdress() << endl;
    cout << "compareTo Adress: " << compareTo.getAdress() << endl;

    vector<string>::iterator adressBlockThis = this->getAdressBlocks().begin();
    cout << "this first block: " << *adressBlockThis << endl;

    vector<string>::iterator adressBlockCompareTo = compareTo.getAdressBlocks().begin();
    cout << "compareTo first block: " << *adressBlockCompareTo << endl;
    cout << "this first block second printout: " << *adressBlockThis << endl;
    ...

来自主:

IPv4 myIP("1.2.3.4");
cout << "Get IP: " << myIP.getAdress() << endl;

IPv4 mySecondIP("5.6.7.8");
cout << "Get IP: " << mySecondIP.getAdress() << endl;

cout << myIP.getAdress() << " == " << mySecondIP.getAdress() 
    << " = " << (myIP == mySecondIP) << endl;

输出控制台:

Neue IP Addresse: 1.2.3.4
Get IP: 1.2.3.4
Neue IP Addresse: 5.6.7.8
Get IP: 5.6.7.8
1.2.3.4 == 5.6.7.8 =
 ... in operator == ...
this Adress: 1.2.3.4
compareTo Adress: 5.6.7.8
this first block: 1
compareTo first block: 5
this first block second printout: 5  <------- this should be 1 
1

【问题讨论】:

也许,但是执行该操作的代码在哪里?不是他的问题。 恐怕你留下了太多的可能性。我建议制作一个minimal reproducible example。如果制作 MCVE 并没有向您揭示问题和解决方案(通常情况下),请编辑问题以添加 MCVE。 你是对的,没有足够的信息。所以我附上了其余的: 还有一些遗漏:具体来说,getAddressBlocks的实现 @TheFox 你添加了散文,没有minimal reproducible example。 【参考方案1】:

您的迭代器没有被“覆盖”,它正在失效。它悬空。两个都是。

您看到的数字纯属偶然。 (好吧,它们不是;我们可以推断为什么您会在某种程度上看到它们,在这种情况下,它们的来源很明显,但是未定义的行为是未定义的行为,最好将其保留在那里。 )

getAdressBlocks 应该返回一个 reference 到现有向量。它返回的值/副本现在几乎立即消失,留下一个指向不再存在的东西的第一个元素的迭代器。

您通过 const IPv4&amp; 调用此函数,因此它必须(并且应该)返回 const 引用:

const vector<string>& IPv4::getAdressBlocks() const

    return IPBlocksOfAdress;

这也意味着您的迭代器必须是vector&lt;string&gt;::const_iterator

而且你一直拼错“地址”。

【讨论】:

对于“地址”的事情。我把德语和英语混在一起了。在德语中是 Adresse 在英语中是地址。

以上是关于第二个迭代器覆盖第一个迭代器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

十迭代器生成器

C ++ 插入迭代器

关于java中ArrayList的快速失败机制的漏洞——使用迭代器循环时删除倒数第二个元素不会报错

迭代器

走入计算机的第二十天(迭代器)

为啥我需要另一个迭代器作为 std::copy() 中的参数?