C++矢量访问元素

Dem*_*tor 5 c++ vector

我怎样才能myVector像访问数组一样访问元素(for(i = 0; i < n; i++) cout << v[i] << " ";)

我的代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Month
{
public:
    char *name;
    int nr_days;
    Month(char* c, int nr) : name(c), nr_days(nr){};
    ~Month() { /* free(name); */}
};

int main()
{
    Month January("January", 31);
    Month February("February", 28);
    Month March("March", 31);
    Month April("April", 30);
    Month May("May", 31);
    Month June("June", 30);
    Month July("July", 31);
    Month August("August", 31);
    Month September("September", 30);
    Month Octomber("Octomber", 31);
    Month November("November", 30);
    Month December("December", 31);

    vector<Month> *myVect = new vector<Month>;
    myVect->push_back(January);
    myVect->push_back(February);
    myVect->push_back(March);
    myVect->push_back(April);
    myVect->push_back(May);
    myVect->push_back(June);
    myVect->push_back(July);
    myVect->push_back(August);
    myVect->push_back(September);
    myVect->push_back(Octomber);
    myVect->push_back(November);
    myVect->push_back(December);

    for(vector<Month>::const_iterator i = myVect->begin(); i != myVect->end(); i++)
    {
        /*
        Month myMonth = i;
        cout << myMonth.name << " " << myMonth.nr_days << endl;
        */
    }

    free(myVect);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想要像foreach算法: foreach(Month in myVect) cout << ...

另一个问题:如果我取消注释我的行,为什么它会在析构函数中给出运行时错误?

Ed *_* S. 7

好的,这里有很多问题.

  1. 您声明myVect为向量的指针.这是不必要的.使用矢量的一个主要好处是,您不必担心内存管理,因为vector它适合您.堆栈分配向量,但在内部它堆分配用于存储它包含的项的内存.

  2. 你永远不会初始化指针.您正在调用未定义的行为,因为该指针无效.初始化您使用的指针new.你所拥有的是一个无效的堆栈分配指针,它不指向vector堆上的a.编辑:我刚刚意识到它new被删除了,所以你可以忽略这个.不过,它根本不应该是一个指针.

  3. 您正在使用free解除分配C++类(您从未分配过以...开头).别.这不是C,你在C++中使用newdelete管理内存(必要时!). free它不会调用析构函数,它只会释放一大块内存. delete另一方面,因为它知道如何处理复杂的C++类型. 切勿混用new/ deletemalloc/ free.

  4. myVect->begin()返回a const_iterator,而不是a T(即,在这种情况下,不是Month对象).通过*运算符取消引用迭代器将产生当前的迭代对象,因此:


Month myMonth = *i  // <--- IMPORTANT!
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你要经常循环遍历向量,你可能想要typedef迭代器来减少冗长,即,

typedef vector<Month>::const_iterator cmonth_iter;
Run Code Online (Sandbox Code Playgroud)

现在你可以写了

for(cmonth_iter i = myVect.Begin(); i != myVect.end(); ++i )
{
    Month m = *i;
    // do stuff with m    
}
Run Code Online (Sandbox Code Playgroud)