动态矢量大小,为什么这会给出一个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");
}
但这也给出了一个段错误。
答案 0 :(得分:5)
向量不会完全自动调整大小。您可以使用push_back
或resize
在运行时更改矢量的大小,但矢量将不根据您使用的索引自动调整大小 - 如果您如果索引超出当前大小,则会出现未定义的行为。
在您的演示代码中,您可以执行以下操作:
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.