gpt4 book ai didi

c++ - 为什么 C++ 字符串迭代器不检查错误?

转载 作者:行者123 更新时间:2023-12-03 09:03:13 24 4
gpt4 key购买 nike

我是一名大学生。我的任务是编写单链表。我开始使用暴露的节点(c# style)来实现它,但是在使用时会导致许多空检查。然后我将节点设为私有(private),列表元素通过迭代器(stl style)公开,因此没有空检查,但仍然需要检查迭代器是否不在列表末尾。我想写一个好的实现,所以做了一个简单的测试,看看c++ STL是如何处理一些错误的:

#include <iostream>

using namespace std;

int main()
{
string first = "afasdasds";
string second = "asdadas";
int i = 0;
for(auto it = first.begin(); i < 100; it++)
{
bool result = it > second.begin();
cout << result;
i++;
}
}

它没有。它在没有我检查的情况下进入无限循环。
  • 迭代器不应该检查比较是否有意义吗?显然,比较来自不同列表的迭代器应该会引发错误。
  • ++ 运算符不应该检查它是否没有溢出吗?这段代码:
    using namespace std;
    int main()
    {
    string first = "afasdasds";
    for(auto it = first.begin();; it++)
    {
    cout << *it;
    }
    }

  • 打印部分内存,然后打印段错误。
    我认为这些错误检查是合理的。他们也不应该很难写。为什么它们没有在 STL 中实现,它们应该实现吗?它会被认为是良好的代码实践吗?我还没有经验,所以我很难判断代码应该有多“完美”。这是停止的好时机,还是我们应该进一步编写错误检查?

    最佳答案

    这是一个权衡,性能与安全性。

    检查会减慢速度。对于可以达到 的迭代器批号因为它们在紧密循环中被递增和取消引用。
    STL 的许多实现通过使用库的调试和发布版本来缓解这种情况,这样您就可以在测试期间运行检查,但在没有检查的情况下发布。

    不管 STL 的基本理念是什么鼓励更安全的编程。如果您考虑一下,迭代器应该始终来自安全的地方。

    那是在进程开始时,您可以通过调用容器的 begin() 来获取迭代器。或 end()函数,或者作为算法返回的结果,可能是 std::find例如。

    您也可以使用更安全的结构,例如 range based for .

    这种编程风格有助于保持边界安全。

    当您使用索引或迭代器偏移时会发生真正危险的事情,如果可能的话应该避免。存储迭代器以供以后使用也不是很安全。

    所以使用迭代器和 不要使用索引(除非你必须)。尽量避免让迭代器超出其直接使用范围。

    但是,最重要的是,使用 DEBUG版本和 测试,测试,测试 这样您的边界检查就可以高度自信地完成。

    关于c++ - 为什么 C++ 字符串迭代器不检查错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49194311/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com