我使用的是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,这不是我想要的。正如我早期描述的,我想要修复容器的大小编译时间。)
提前谢谢!!
答案 0 :(得分:1)
从您提出问题的方式来看,我假设您说&#34;迭代&#34;,但实际上意味着&#34;算法&#34;。
该行为不是特定于容器,而是特定于容器的迭代器类型。
std::array::iterator_type
符合RandomAccessIterator,与std::vector
和std::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()
。
为了完整性:
list
,set
,multiset
,map
,multimap
)仅支持++
和{{ 1}}。--
,forward_list
,unordered_set
,unordered_multiset
,unordered_map
)仅支持unordered_multimap
。++
的结果。答案 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;
}