【问题标题】:Is there a way of iterating through a C++ array without needing to know the end address from the start?有没有一种方法可以遍历 C++ 数组而不需要从一开始就知道结束地址?
【发布时间】:2020-09-26 13:23:31
【问题描述】:

每当我通过指针算法迭代 C++ 数组时(即不使用 Java 风格的索引递增),我首先获取数组中最后一个元素的地址,然后只要当前地址不是最后地址:

#include <iostream>
using namespace std;

int main()
{
    int values[] = { 1, 2, 3, 4, 5 };
    int* lastAddress = values + size(values);

    for (int *p=values; p != lastAddress; p++) {
        cout << "val: " << *p << endl;
    }
}

这是做这种事情的普遍接受的方式吗?

【问题讨论】:

  • 不,“普遍接受”的方式是使用 C++11 的范围迭代,为您完成所有这些工作。这是处理数组的传统方式。 C++11 已经有将近十年的历史了,它提供了更方便的方式来处理许多此类性质的事情。
  • 这能回答你的问题吗? C++11 range based loop: How does it really work
  • for (auto p = begin(values); p != end(values); ++p) ,for循环也可以这样替换。
  • 伙计们,不要在 cmets 中回答。谢谢。
  • @TMOTTM std::begin / std::end 不返回指针。他们返回迭代器

标签: c++ arrays


【解决方案1】:

您可以使用基于范围的for 循环。像这样:

for (const auto val : values) {
    std::cout << "Val: " << val << '\n';
}

注意使用\n 而不是std::endlstd::endl 表示流的std::flush,您可能不需要在每一行之后都使用它。如果需要,您可以在循环之后执行一项。

【讨论】:

  • 注意:这里假定valuesstd::arraystd::vector,而不是问题中的简单C 数组。但在 C++ 中使用简单的 C 数组通常不是一个好主意。
  • @Wolfram 也适用于 C 数组。 godbolt.org/z/rq3jxb
  • @Wolfram 不。原生数组很好。
  • 更好地改进并可能删除解释性说明。正如你对可恶的 using 命名空间所做的那样,尽管 dropping a note would be nice.
  • @Wolfram 虽然std::array 确实比 C 数组更受欢迎,但这与问题中的任何内容无关,对于基于范围的std::beginstd::end一切都很好。维度是类型的一部分,这就是它们的工作方式。 :)
【解决方案2】:

这是做这种事情的普遍接受的方式吗?

不,不是。您不应该使用手工指针算法来确定容器的 startend。这就是 std::begin()std::end() 的用途:

#include <iostream>
using namespace std;
int main() {
    int values[] = { 1, 2, 3, 4, 5 };

    for (auto p = std::begin(values); p != std::end(values); p++) {
        cout << "val: " << *p << endl;
    }
}

您可以使用range based for loop 作为一个简短的形式,它在后台使用相同的机制:

for(auto value : values) {
    cout << "val: " << value << endl;
};

请注意,这只适用于本地声明的已知大小 (sizeof()) 的数组。

如果你得到这样的数组定义传递给一个函数,你仍然需要传递大小:

 foo(int values[], size_t size) {
      for(auto val = std::begin(values); p != std::begin(values) + size; ++p) {
          // ...
      }
 }

公认的标准方法是完全放弃原始数组,转而使用 std::array&lt;T,N&gt; 用于已知大小的数组,或使用 std::vector&lt;T&gt; 用于未知大小的数组。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2013-06-15
    • 1970-01-01
    • 2017-09-20
    • 2021-05-22
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多