49. Agrupación de palabras de letras extraterrestres
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
map<string,int> position; //纪录同一类别的位置
vector<vector<string>> result; //结果
int len=0;
for(int i=0;i<strs.size();i++){
string temp=strs[i];
sort(temp.begin(),temp.end());
//判断position里面是否有位置信息,没有就需要新增一个[]
if(position.count(temp)==0){
vector<string> x;
result.push_back(x);
position[temp]=len;
len++;
}
result[position[temp]].push_back(strs[i]);
}
return result;
}
};
En el desarrollo de C ++, a menudo usaremos operaciones de inserción para operar varios contenedores stl, como vector, mapa, conjunto, etc. Antes de la introducción de las referencias de rvalue, los constructores de transferencia, los operadores de copia de transferencia, generalmente usan push_back () para agregar un elemento rvalue (objeto temporal) al contenedor, primero llame al constructor para construir el objeto temporal y luego necesita llamar a la construcción de la copia La función coloca este objeto temporal en el contenedor. Se liberan las variables temporales originales. El problema causado por esto es el desperdicio de recursos de aplicaciones variables temporales.
Se introdujeron las referencias rvalue, después del constructor de transferencia, el constructor y el constructor de transferencia se llamarán cuando push_back () rvalues. Si se puede construir directamente al insertar, solo necesita construirse una vez. Esto es lo que agregó c ++ 11 emplace_back
.
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> mp;
for (string& str: strs) {
string key = str;
sort(key.begin(), key.end());
mp[key].emplace_back(str);
}
vector<vector<string>> ans;
for (auto it = mp.begin(); it != mp.end(); ++it) {
ans.emplace_back(it->second);
}
return ans;
}
};