矢量声明

Declaration of Vectors

本文关键字:声明      更新时间:2023-10-16

向量是动态大小的,所以为什么会出现段错误:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
    vector<int> vectorOfInts;
    vectorOfInts[0] = 3;
}

我实际上要做的是在类中声明一个向量。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Directory{
    public:
        string name;
        int maxIndex;
        vector<Directory> subDirectories;
        void addSubdirectory(string x){
            Directory newSubdirectory(x);
            subDirectories[maxIndex++] = newSubdirectory;
        }
        Directory(string x){
            name = x;
            maxIndex = 0;
        }
};
int main(){
    Directory root("root");
    root.addSubdirectory("games");
}

向量不会完全自动调整大小。您使用push_backresize在运行时更改vector的大小,但是vector将而不是根据您使用的索引自动调整自身的大小——如果索引超出其当前大小,则会得到未定义的行为。

在你的演示代码中,你可以这样做:
vector<int> vectorOfInts(1);
vectorOfInts[0] = 3;
或者,因为您只是将3添加到现有数据(或不存在的数据,在这种情况下)的末尾,您可以使用push_back(或emplace_back):
vector<int> vectorOfInts;
vectorOfInts.push_back(3);

看起来相同的基本方法也可以用于您的实际代码。它还简化了一些事情,因为您不需要像之前那样显式地跟踪maxIndex。

默认构造的vector没有元素(即其size()返回0)。

operator[]不检查是否提供了一个有效的索引,如果提供了一个无效的索引,则给出未定义的行为。它不调整向量的大小。大小为0的向量没有有效的索引。

这个组合解释了你的问题

seg错误,来自于您试图访问一个不存在的元素。当你使用操作符[]时,确保你已经使用resize, push_back, emplace_back…为这个元素分配了内存

要使代码正常工作,只需替换

void
addSubdirectory(string x)
{
    Directory newSubdirectory(x);
    subDirectories[maxIndex++] = newSubdirectory;
}

void
addSubdirectory(string x)
{
    subDirectories.emplace_back(x); // c++11
                                   // else subDirectories.push_back(Directory(x));
}

,你不需要maxIndex,你可以使用size方法:subDirectories.size() - 1.