2016-03-31 21 views
4

私はstd :: array(C++ 11)を使用しています。コンパイル時に(実行時とは逆に)サイズを固定したいので、std :: arrayを使用することを選択しています。とにかく最初のN要素だけを反復することができますか?つまり、のようなもの:C++の最初のN要素を反復する11 std :: array

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

試しましたか? – DevSolar

+0

私はあなたの質問とあなたの目標を理解しているとは思えませんが、配列内のN個の最初の要素のすべての*奇数を取得したいですか?そのために['std :: transform'](http://en.cppreference.com/w/cpp/algorithm/transform)を使うことができます。それ以外の場合は、通常の 'for'ループを使い、N個の要素を繰り返し処理します。 –

+0

'std :: find_if'を' 4'がパラメータである関数に置くことはできませんか? – TartanLlama

答えて

1

を、私はあなたがは「反復処理」と言うと仮定し、実際にはの平均値はである。

動作はコンテナに固有のものではなく、コンテナのイテレータタイプに対応しています。

std::array::iterator_type満たすRandomAccessIteratorstd::vectorstd::deque同じ。イテレータが生じ

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

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

あなたはそれに数nを追加することができますが与えられたことを意味し

、...

auto end = myArray.begin() + 4; 

... 1つの要素を超えてn th配列内の要素です。それは、シーケンスの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番目の要素を見つけ出し、 "Found"を出力します。

#define N 4から#define N 3に変更し、何も印刷しません。

もちろん、これはあなたの配列Nの要素を持っていると仮定しています。不明な場合は、最初にN <= myArray.size()にチェックを入れ、必要に応じてmyArray.end()を使用してください。完全を期すため


  • BidirectionalIteratorlistsetは、multisetmapmultimapは)のみ++--サポート。
  • ForwardIteratorforward_listunordered_setunordered_multisetunordered_mapunordered_multimap)のみ++をサポートしています。
  • InputIteratorは、接尾辞++の結果の参照解除をサポートしていません。
+0

あなたはまた、あなたが答えている質問を明確にすることができますか? OPのポストをもう一度読むと、私は彼の質問にどう答えているのかわかりません。 (これは良い、情報に基づいた回答ですが、何が*質問*答えているのか分かりません)。また、 '#define'で定義された定数も避けるべきです。 – Tobias

+0

@Tobias:C11の 'std :: array'の最初のN要素を反復する方法。あなたは知っている、質問の*タイトル*。 ;-) – DevSolar

+0

なぜ 'std :: find'を使っていますか? – Tobias

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; 
} 
関連する問題