【问题标题】:pointers are bi directional iterators? [duplicate]指针是双向迭代器? [复制]
【发布时间】:2018-08-07 16:10:53
【问题描述】:

我偶然发现了一些让我完全困惑的事情。

std::reverse() 将双向迭代器作为参数传入函数,但是当我将指针传递给函数时,它似乎工作正常并且实际上反转了字符串。

void reverseFour(char* str) {
    reverse(str, str + strlen(str));
}

int main {
    char *str = "hello";
    str += '/0';
    reverseFour(str);
}

所以,我的问题是,这怎么可能?双向迭代器不是指针,对吧?

【问题讨论】:

  • 否,但指针是双向迭代器,选择迭代器接口是为了与指针语法兼容
  • 牛是动物并不意味着动物是牛。
  • 指针甚至是随机访问迭代器,至少当它们指向数组元素时。
  • @nwp -- 任何用作迭代器的指针都必须指向一个数组。如果没有,则不能增加或减少它。
  • 显示的代码具有未定义的行为,因为main() 正在将一个指向字符串文字的指针传递给std::reverse()(以及一个非常量指针,即在 C++11 中不允许,除非您告诉编译器禁用该限制)。 reverse() 将尝试写入只读内存,这可能会使应用程序崩溃。要使代码有效,请改用char str[] = "hello";

标签: c++ pointers iterator


【解决方案1】:

实际上,指针是一种RandomAccessIterator。这甚至比BidirectionalIterator 更好,因为任何需要BidirectionalIterator 的算法也将接受RandomAccessIterator,包括指针。

这是非常刻意的,非常有用。

当然,确实存在其他类型的迭代器,特别是一些专门用作迭代器的类型(例如,您可以从std::setstd::map 获得这些)。但Iterator 的概念是 C++ 故意保留的相当笼统的概念。

【讨论】:

  • @Slava:整数不是一种迭代器。别傻了。
  • @Slava:更好的迭代器。你正在移动球门柱。您的第一条评论谈到了比较迭代器的类别。现在你在谈论谁知道什么。
  • @Slava:现在你提出了一个稻草人的论点,因为这根本不是我所说的。
  • @Slava 随机访问迭代器更好,因为您可以使用它进行更多操作(限制较少)。
  • 我比继续这个愚蠢的讨论要好,我知道很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2015-06-26
  • 2018-05-30
  • 2014-10-13
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多