迭代c ++ 11 std :: array的前N个元素

时间:2016-03-31 10:40:43

标签: c++11

我使用的是std :: array(c ++ 11)。我选择使用std :: array,因为我希望在编译时修复大小(而不是运行时)。无论如何我只能迭代前N个元素。例如:

std::array<int,6> myArray = {0,0,0,0,0,0};
std::find_if(myArray.begin(), myArray.begin() + 4, [](int x){return (x%2==1);});

这不是最好的例子,因为find_if返回一个标记FIRST奇数的迭代器,但你明白了(我只想考虑前N,在这种情况下N = 4,我的std :: array的元素)

注意:有类似于这个的问题,但答案总是涉及使用不同的容器(矢量或valarray,这不是我想要的。正如我早期描述的,我想要修复容器的大小编译时间。)

提前谢谢!!

2 个答案:

答案 0 :(得分:1)

从您提出问题的方式来看,我假设您&#34;迭代&#34;,但实际上意味着&#34;算法&#34;。

该行为不是特定于容器,而是特定于容器的迭代器类型。

std::array::iterator_type符合RandomAccessIterator,与std::vectorstd::deque相同。

这意味着,给定

std::array<int,6> myArray = {0,0,0,0,0,0};

auto end = myArray.begin() // ...

您可以为其添加一个n ...

auto end = myArray.begin() + 4;

...导致一个元素超出数组中n元素的迭代器。因为这是序列的end迭代器的定义

std::find_if(myArray.begin(), myArray.begin() + 4, ... )

工作得很好。一个更直观的例子:

#include <algorithm>
#include <array>
#include <iostream>

#define N 4

int main()
{
    std::array<char, 6> myArray = { 'a', 'b', 'c', 'd', 'e', 'f' };
    auto end = myArray.begin() + N;
    if ( std::find( myArray.begin(), end, 'd' ) != end )
    {
        std::cout << "Found.\n";
    }
    return 0;
}

这将找到数组中的第4个元素,并打印&#34; Found。&#34;

#define N 4更改为#define N 3,并且不打印任何内容。

当然,假设您的数组具有 N元素。如果您不确定,请先检查N <= myArray.size(),然后根据需要使用myArray.end()

为了完整性:

  • BidirectionalIterator listsetmultisetmapmultimap)仅支持++和{{ 1}}。
  • ForwardIterator --forward_listunordered_setunordered_multisetunordered_map)仅支持unordered_multimap
  • InputIterator不支持取消引用后缀++的结果。

答案 1 :(得分:0)

如果您想迭代std::array的前N个数字,请执行以下操作:

#include <iostream>
#include <array>

int main() {
    constexpr const int N = 4;
    std::array<int, 6> arr{ 0, 1, 2, 3, 4, 5 };
    for (auto it = std::begin(arr); it != std::begin(arr) + N && it != std::end(arr); ++it)
        std::cout << *it << std::endl;
}