在Visual Studio中初始化std :: vector大小

时间:2016-09-06 23:29:04

标签: c++ visual-studio vector initialization size

为什么我不能在Visual Studio中初始化<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.js"></script> <div class="stuff"> <p>This is stuff</p> <p>This is other stuff</p> <p>A <a href="#" class="finished">link</a> is in here.</p> </div> <div id="blocker"></div>大小?

std::vector

IntelliSense类型检查:

#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.)*?\\\"") }
};

1 个答案:

答案 0 :(得分:2)

任何对象只能进行一次初始化 - 您可以执行

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 = XXXvector<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。