被这个整的很烦,这些语法也太反人类了。
网上的介绍都是从构造函数重载类型出发的,这根本不是人类的思维方式。
人类的习惯明明是从需求出发。
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同理。