矢量声明
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_back
或resize
在运行时更改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.
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别