C++ STL vector初始化

被这个整的很烦,这些语法也太反人类了。

网上的介绍都是从构造函数重载类型出发的,这根本不是人类的思维方式。

人类的习惯明明是从需求出发。

 

 

1.只想赋一个值

vector<string> v={"hello"};

 

2.想赋多个相同值

vector<string> v(6,"nihao");

//缺省后一项时,默认值为内存意义上的全0

vector<string> v(6); //得到6个空字符串

vector<int> v(6);   //得到6个数字0

 

使用过程中,发现在class里面用法2声明vector会报错“应输入类型说明符”。

需要修改一下,把初始化语句放在“构造函数初始化列表”里。

class stu {
public:
	int total;
	vector<int> s;

	stu() :total(0),s(5, -1) {}
};

//源自https://blog.csdn.net/chen134225/article/details/81365352

 

3.想赋多个不同值

vector<string> init{ "S","H","C","D" }; //vs2017编译通过

vector<string> init={ "S","H","C","D" }; //等价形式

 

上述的骚操作类似于不指定长度的数组初始化

int a[]={1,2,3,4,5,6,7,8,9,0};

//在vs里可以看到a的类型为int[10]

 

使用数组的首位地址也可以达成类似的初始化效果

vector<int> v(a,a+10);

 

4.其他

vector<string> v2(v1); 

//等价于

vector<string> v2=v1; //都是copy

 

还有用insert方法的,贼麻烦。

vector<string> v;

① 使用initializer_list<基本类型>

v.insert(v.begin(), {"ni","hao"}); //如果要这样为什么不直接用3

② 使用首尾迭代器
    vector<string> v2 = {"ni","hao"};
    v.insert(v.begin(), v2.begin(), v2.end()); //同类型迭代器,可以任意替换,哪怕是list<string>的迭代器都行。

③ (vector<string>::iterator _where, size_t Count_ , const string& val)

v.insert(v.begin(),3,"hello");   //但是这种方法又跟前面的重合了

④ 右值引用(vector<string>::iterator _where, std::string &&_val)

v.insert(v.begin(),"hello");  //右值引用,直接传入字符串时触发本条,与⑤有区别

⑤ 引用(vector<string>::iterator _where, const std::string &_val)

string s="hello";

v.insert(v.begin(),s);  //左值引用,使用字符串对象时触发本条。

 

 

掌握了上述规则,就可以畅通stl了。

 

map转vector

map<string, int> mp;
mp["aa"]=1;
mp["bb"]=2;

vector<pair<string, int> > v(mp.begin(), mp.end());

set转vector同理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值