string中拷贝构造的现代写法
string(const string& s)
:_str(nullptr)
{
string tmp(s);
swap(_str,tmp._str);
}
//s1=s3
string& operator=(string s)
{
swap(_str,s._str);
return *this;
}
s(由s3调拷贝构造而来)是一个临时对象出了作用域要调析构函数。
//string s2(s1)
string(const string& s)
:_str(nullptr),_size(0),_capacity(0)
{
string tmp(s);
this->swap(tmp);
}
void swap(string& s)
{
::swap(_str, s._str);
::swap(_size, s._size);
::swap(_capacity, s._capacity);
}
实用的初始化方案
vector<int> v={ 0,1,2 };
for (auto e : v)
cout << e << endl;
vector<vector<int>> v{ {0,1,2},{3,4,5} };
cout << v[1][1];
vector中的迭代器
vector<int> v = { 0,1,2 };
vector<int> ::iterator vit = v.begin();
while (vit != v.end())
{
cout << *vit << " ";
vit++;
}
vector的增容可能是二倍也可能是1.5倍,各有利弊。
resize是开空间+初始化而reserve只有开空间。
136. 只出现一次的数字
class Solution {
public:
int singleNumber(vector<int>& nums) {
int value=0;
for(auto& e:nums)
value^=e;
return value;
}
};
137. 只出现一次的数字 II
class Solution {
public:
int singleNumber(vector<int>& nums) {
int bitarr[32];
for(auto e:nums)
{
for(int i=0;i<32;i++)
{
if(e&(1<<i))
bitarr[i]++;
}
}
int ret=0;
for(int i=0;i<32;i++)
{
if(bitarr[i]%3==1) ret+=(1<<i);
}
return ret;
}
};