可能重复:
C++ 中单个元素的静态数组初始化
在 C 中,我可以像这样初始化数组中的特定下标项:
int array[100] = {[22] = {1}, [33] = {33}};
但是这个片段不能被 g++ 编译。那么如何通过 C++ 初始化数组中的特定下标项。
可能重复:
C++ 中单个元素的静态数组初始化
在 C 中,我可以像这样初始化数组中的特定下标项:
int array[100] = {[22] = {1}, [33] = {33}};
但是这个片段不能被 g++ 编译。那么如何通过 C++ 初始化数组中的特定下标项。
好吧,我正在等待像你这样的目标:D
在 C++ 中,我们有std::array
-std::std::initializer_list
那么为什么不将这两件事结合在一起,以使其工作:
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
你不能。这不是合法的 C++ 代码。
您需要初始化整个数组,然后再分配特定元素。也许:
int array[100] = {};
array[22] = 1;
array[33] = 33;
仅在 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
你不能,你只能在事后分配它。
你可以写 :
array[22] = 1;
array[33] = 33;