C++ 向量用值初始化

C++ vector initialize with value

作为 C++ 初学者,我知道我们可以使用以下方法初始化向量的向量:

vector<vector<int>> vec(10, vector<int>(15, 0));

效率很高, 但是当我想用我写的结构做同样的事情时,代码将无法编译:

vector<TreeNode> vec(10, TreeNode("abc"));

结构如下所示:

struct TreeNode {
    std::string val;
    TreeNode* left;
    TreeNode* right;
    explicit TreeNode(std::string& val) {
        this->val = val;
        left = nullptr, right = nullptr;
    }

};

我想知道这里有什么问题

我使用 Clion 作为我的 IDE,IDE 报告了这个错误: No matching conversion for functional-style cast from 'const char [4]' to 'TreeNode'

并且编译器报告了这个错误:

问题不在 std::vector 的初始化(这是正确的),而在 TreeNode 结构的初始化。

修改后的代码有效:

std::string initVal = "abc";
std::vector<TreeNode> vec(10, TreeNode(initVal));

"abc" 这样的字符串不是 std::string。不过没关系! std::string,例如 TreeNode 构造函数中的参数,可以从一个自动构造。

但是,该字符串将是一个 临时 ,并且临时字符串不会绑定到非 const 引用(带有 Visual Studio 扩展名的除外) .

这也没关系:您不需要它们;您的构造函数可以采用 const std::string& 代替,一切都会好起来的。

其他解决方案包括按值获取 std::string,这实际上是一个好主意,因为您可以在构造函数中从它 std::move,现在无论您是否传递,构造函数都是高效的在临时或移动中的其他一些命名字符串中。但这是另一天的故事。

顺便说一句,如果此项目用于生产,并且您的向量可能比示例中显示的多很多,我强烈建议您不要嵌套他们喜欢这样。每个元素都有自己的内存管理和间接寻址,非常浪费。您的数据是方形的(内部维度始终具有相同的大小),因此您实际需要的只是一个 10*15 ints 的向量。然后那些 ints 将全部存在于一个很好的大数组中,这是缓存友好的,只需要 one 分配和 one 释放!而不是每个 165 个。现在你必须用一些数学来包装你的访问(比如 index = y*width + x),但这很简单。