在 Visual Studio 中初始化 std::vector 大小
Initialization of std::vector size in Visual Studio
为什么我无法在 Visual Studio 中初始化 std::vector
大小?
#include <vector>
#include <regex>
#include "Lexer.h" // TokenRule definition
vector<TokenRule> tokenRules(3) = {
{ TokenType::Identifier, regex("[a-zA-Z_][a-zA-Z0-9_]*") },
{ TokenType::Number, regex("[+-]?[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?") },
{ TokenType::String, regex("\\"(?:(?=(\\?))\1.)*?\\"") }
};
IntelliSense 类型检查:
std::vector<TokenRule *> tokenRules(3) = {
^^^^
任何对象只能进行一次初始化 - 您可以执行
std::vector<TokenRule *> tokenRules(3);
这将调用构造函数,声明为 vector(size_type _Count)
,创建一个包含 3 个默认初始化元素的向量,或者
vector<TokenRule> tokenRules{
{ TokenType::Identifier, regex("[a-zA-Z_][a-zA-Z0-9_]*") },
{ TokenType::Number, regex("[+-]?[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?") },
{ TokenType::String, regex("\\"(?:(?=(\\?))\1.)*?\\"") } };
会调用 vector(initializer_list<value_type> _Ilist)
- 完全不同的构造函数。后者是您想要的,因为它将使用 initializer_list
的大小来确定所需的向量大小(在您的情况下为 3)。
请注意,vector<TokenRule*> tokenRules = XXX
几乎是 vector<TokenRule*> tokenRules(XXX)
的语法糖,您不能使用 tokenRules = 3
的唯一原因是 std::vector
明确禁止它。所以在某种程度上你可以说你的代码相当于
std::vector<TokenRule *> tokenRules(3){/*initializer list here*/};
具有 1 个对象的 2 个初始值设定项。希望这会使错误的来源更加清楚。
你也可以
std::vector<TokenRule *> tokenRules(3);
tokenRules = {/*initializer list*/};
虽然这有点多余(并且容易出错),但实际性能损失应该接近 0。
为什么我无法在 Visual Studio 中初始化 std::vector
大小?
#include <vector>
#include <regex>
#include "Lexer.h" // TokenRule definition
vector<TokenRule> tokenRules(3) = {
{ TokenType::Identifier, regex("[a-zA-Z_][a-zA-Z0-9_]*") },
{ TokenType::Number, regex("[+-]?[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?") },
{ TokenType::String, regex("\\"(?:(?=(\\?))\1.)*?\\"") }
};
IntelliSense 类型检查:
std::vector<TokenRule *> tokenRules(3) = {
^^^^
任何对象只能进行一次初始化 - 您可以执行
std::vector<TokenRule *> tokenRules(3);
这将调用构造函数,声明为 vector(size_type _Count)
,创建一个包含 3 个默认初始化元素的向量,或者
vector<TokenRule> tokenRules{
{ TokenType::Identifier, regex("[a-zA-Z_][a-zA-Z0-9_]*") },
{ TokenType::Number, regex("[+-]?[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?") },
{ TokenType::String, regex("\\"(?:(?=(\\?))\1.)*?\\"") } };
会调用 vector(initializer_list<value_type> _Ilist)
- 完全不同的构造函数。后者是您想要的,因为它将使用 initializer_list
的大小来确定所需的向量大小(在您的情况下为 3)。
请注意,vector<TokenRule*> tokenRules = XXX
几乎是 vector<TokenRule*> tokenRules(XXX)
的语法糖,您不能使用 tokenRules = 3
的唯一原因是 std::vector
明确禁止它。所以在某种程度上你可以说你的代码相当于
std::vector<TokenRule *> tokenRules(3){/*initializer list here*/};
具有 1 个对象的 2 个初始值设定项。希望这会使错误的来源更加清楚。
你也可以
std::vector<TokenRule *> tokenRules(3);
tokenRules = {/*initializer list*/};
虽然这有点多余(并且容易出错),但实际性能损失应该接近 0。