当前位置: 代码迷 >> C++ >> [生手学习C++]vector容器与数组
  详细解决方案

[生手学习C++]vector容器与数组

热度:4925   发布时间:2013-02-26 00:00:00.0
[新手学习C++]vector容器与数组
在书上 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