向量声明

时间:2015-07-23 22:56:32

标签: c++ vector

动态矢量大小,为什么这会给出一个seg错误:

#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");
}

但这也给出了一个段错误。

3 个答案:

答案 0 :(得分:5)

向量不会完全自动调整大小。您可以使用push_backresize在运行时更改矢量的大小,但矢量将根据您使用的索引自动调整大小 - 如果您如果索引超出当前大小,则会出现未定义的行为。

在您的演示代码中,您可以执行以下操作:

vector<int> vectorOfInts(1);

vectorOfInts[0] = 3;

或者,由于您只是将3添加到现有数据的末尾(在这种情况下是不存在的数据),您可以使用push_back(或emplace_back ):

vector<int> vectorOfInts;
vectorOfInts.push_back(3);

看起来相同的基本方法也适用于您的真实代码。它还简化了一些事情,因为您不需要像您一样明确跟踪maxIndex。

答案 1 :(得分:1)

默认构造的向量没有元素(即它的size()返回零)。

operator[]不会检查它是否提供了有效索引,并且如果提供了无效索引,则会提供未定义的行为。它不会调整矢量大小。大小为零的向量没有有效索引。

这种组合解释了你的问题。

答案 2 :(得分:0)

seg错误来自于您尝试访问不存在的元素的事实。当你使用operator []时,请确保你已经使用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.