在书上 vector有这样一段代码:
vector<int> ivec;
for(vector<int>::size_type index = 0;index != 10;++index)
{
ivec[ix] = ix;
}
因为下标只能用于获取已存在的元素,而ivec是一个空的vector容器,故有错。
而对于数组
const array_size = 10;
int[array_size] ia;
for(size_t index = 0;index != array_size;++index)
{
ia[index] = index;
}
由于这里定义了一个大小为10的数组,虽然为对其进行初始化,但是里面依然保存有值,只是其值不确定,故对其赋值没有问题。
请问,这样理解有没有问题?。
C++新手
------解决方案--------------------------------------------------------
这个跟里面是否有值并无关系,与内存空间是否有效有关。这里,数组名实际上是常指针,代表内存地址,使用ia[index],[]为变址运算符,整体被解释为ia + index,index为正负均可,重要的是能找到正确的地址。
而使用vector<int> ivec, ivec[ix] ,这里形式上也是[]运算符,但实质却是调用vector class template对[]运算符的重载,返回vector内含首地址与偏移量相加而得的内存地址的引用,该地址无效。
简单解释一下:
vector内部结构
template<class T>
class vector
{
private:
T *m_pData;
public:
vector(T *pData = NULL):m_pData(pData){}
T& operator[](int index)
{
...
}
...
};
声明空的vector:vector ivec;//m_pData为NULL
使用下标操作:ivec[ix] = ix; // 解释为m_pData + ix,错误,m_pData为NULL