3

重複の可能性:
C++ での個々の要素の静的配列初期化

C では、次のように配列内の特定の添字項目を初期化できます。

int array[100] = {[22] = {1}, [33] = {33}};

しかし、このスニペットは g++ でコンパイルできません。では、配列内の特定の添字項目を c++ で初期化するにはどうすればよいですか。

4

5 に答える 5

1

さて、私はあなたのような目標のためにSOを待っています:D

C++ にはstd::arrayandがありstd::std::initializer_listます。これら 2 つのことを組み合わせて、これを機能させてみませんか。

int main() {
   CArray<int, 7> a { E[1] = 13, E[6] = 14 };
   for (int i = 0; i < 7; ++i) {
      std::cout << a[i] << std::endl;
   } 
}

そして、次の出力を生成します。

0
13
0
0
0
0
14

それで、魔法はどこですか?

std::arrayどこから初期化するstd::initializer_list<EIV_t<T>>か:

template <class T>
struct EIV_t {
  size_t i;
  T      v;
};

新しい std::array:

template <class T, size_t N>
class CArray : private std::array<T,N> {
  typedef std::array<T,N> Base;
public:
  CArray() : Base() {}
  CArray(std::initializer_list<T> l) : Base(l) {}
  CArray(std::initializer_list<EIV_t<T>> l) : Base() {
     for (auto i = l.begin(); i != l.end(); ++i) {
         (*this)[i->i] = i->v;
     }
  }

  // well, private inheritance has its cost
  using Base::operator [];
  // a lot of missing...
};

残りの魔法:

class EI_t {
public:
  EI_t(size_t i) : i(i) {}
  template <class T>
  EIV_t<T> operator = (const T& v) const
  {
     return EIV_t<T> { i, v };
  }
private:
  size_t i;
}; 
class E_t {
public:
  EI_t operator [] (size_t i) const { return EI_t(i); }
}; 
E_t E;

完全な例: http://ideone.com/nzWL0

于 2012-10-11T12:46:40.930 に答える
1

それはいけません。これは正当な C++ コードではありません。

配列全体を初期化し、後で特定の要素を割り当てる必要があります。多分:

int array[100] = {};
array[22] = 1;
array[33] = 33;
于 2012-10-11T10:27:24.610 に答える
1

添え字の初期化は C でのみ許可され、C++ では許可されません。ここで詳細なドキュメントを確認できますhttp://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/language_ref/aryin.htm

各要素を初期化する場合は、配列を宣言した後、値を初期化する次の行で実行できます。

#include<iostream>
using namespace std;

int main(){
    int arr[100];
    arr[22]=33;
    arr[33]=66;
    cout<<arr[22]<<"\t"<<arr[33];
    return 0;
}

次の出力が生成されます。

$ ./a.exe
33      66
于 2012-10-11T10:29:20.167 に答える
0

できません。事後にのみ割り当てることができます。

于 2012-10-11T10:27:29.647 に答える
0

あなたは書ける :

array[22] = 1;
array[33] = 33;
于 2012-10-11T10:28:57.483 に答える