C++:结构体中的std::vector of std::vector

3

我需要创建一个结构体来存储一个包含4个整数向量的std::vector<std::vector<int>>。我尝试使用通常用于向量的声明:

struct myStruct{
   std::vector<std::vector<int>> myVector(4);
};

但是,当我编译时,出现了这个错误:

myProgram.cpp:79:52: error: expected identifier before numeric constant
     std::vector<std::vector<int>> myVector(4);
                                           ^
myProgram.cpp:79:52: error: expected ‘,’ or ‘...’ before numeric constant

我尝试在结构体中声明向量,然后以以下方式在主函数中保留4个元素:

struct myStruct{
   std::vector<std::vector<int>> myVector;
};

int main(){
   myStruct s;
   s.myVector.reserve(4);
   s.myVector[0].push_back(1);
   return 0;
}

通过这种方式编译不会出错,但我一旦尝试使用push_back,就会出现分段错误。

完成此任务的适当方法是什么?为什么我不能使用第一个声明来指定myVector的大小? 谢谢! :)


1
段错误是因为您忘记了 reserve()resize() 之间的区别。就第一个声明而言,尝试将代码更新到2011年的C++标准,并使用统一的初始化语法。如果需要,获取一本更新的教材来全面学习它。 - Sam Varshavchik
1
如果你想知道这是什么样子,那就是 std::vector<std::vector<int>> myVector{ 4 }; 如果编译不通过,那么你的工具链需要设置为使用更高版本的语言标准。 - WhozCraig
2个回答

4
一个类或结构体内的默认成员初始化器必须有一个等号=符号和/或花括号{}
std::vector<std::vector<int>> myVector{4};

[如果类型只是std::vector<int>,这会更加棘手,因为vector中的花括号意味着一系列元素。 std::vector<int>{4}是一个大小为1的向量,其唯一的元素是4,而不是四个零的向量。但是在这里是可以的,因为{4}不能转换为std::initializer_list<std::vector<int>>,因此该构造函数重载不符合条件,vector(size_type)构造函数获胜。]

示例程序具有未定义的行为,因为reserve 不改变大小或创建任何元素。因此,向量仍然为空,所以s.myVector[0]无效。记住,reserve只是向量的设置提示。任何使用reserve的有效程序,如果删除所有reserve调用,仍将有效。

使用resize代替将实现你想要的功能:通过创建4个空元素向量使myVector的大小等于4。然后,push_back将数字1添加到那些向量中的第一个,结果为数据{{1}, {}, {}, {}}

int main(){
   myStruct s;
   s.myVector.resize(4);
   s.myVector[0].push_back(1);
   return 0;
}

1
struct myStruct {
    std::vector<std::vector<int>> myVector{4};
};

int main() {
    myStruct s;
    s.myVector[0].push_back(1);
    s.myVector[0].push_back(2);
    s.myVector[0].push_back(3);
    s.myVector[0].push_back(4);

    s.myVector[1].push_back(11);
    s.myVector[1].push_back(21);
    s.myVector[1].push_back(31);
    s.myVector[1].push_back(41);

    cout << s.myVector[0][0] << " " << s.myVector[0][1] << " " << s.myVector[0][2] << " " << s.myVector[0][3] << " " << endl;
    cout << s.myVector[1][0] << " " << s.myVector[1][1] << " " << s.myVector[1][2] << " " << s.myVector[1][3] << " " << endl;

    return 0;
}

如何正确地完成这个任务?

希望这能回答你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接