仅当值不存在时才将元素从映射添加到对 (C++)
Add element from map to pair only if the value doesn't already exist (C++)
我正在尝试将 map
中的元素添加到 pair vector
中,然后根据值对向量进行排序,但我不想添加具有相同值的元素,而且我不知道如何制作这样的 if 语句。
地图包含单词在 main()
的输入中重复的次数和单词本身,我想对具有地图元素的向量进行排序,但我不想重复单词已重复相同次数。
这是我目前拥有的:
bool compara(pair<string, unsigned int>& a,
pair<string, unsigned int>& b)
{
return a.second > b.second;
}
void sortP(map<string, unsigned int> &M, unsigned int x)
{
vector<pair<string, unsigned int> > A;
for (auto& it : M) {
if(find(A.begin(), A.end(), it.second) == A.end()) // this is the part that
A.push_back(it); // doesn't work
}
sort(A.begin(), A.end(), compara);
for (auto& it : A) {
cout << it.second << "\t"
<< it.first << endl;
}
cout << endl << endl;
// this is where i want to output the element of the vector that appears on the 'x'
// position, after it was sorted
}
如果术语不完全正确,我深表歉意,我刚刚开始习惯使用 maps
和 pairs
。
由于您正在搜索 vector
个 pair
,因此您需要使用 std::find_if()
而不是 std::find()
来查找 vector
元素匹配pair
的特定字段,例如:
for (auto& it : M) {
if (find_if(A.begin(), A.end(), [&](pair<string, unsigned int>& p){ return p.second == it.second; }) == A.end())
A.push_back(it);
}
或者,您可以只使用另一个 map
而不是 vector
,使用 it.second
作为键类型,并让 map
处理排序和复制为您处理。
我正在尝试将 map
中的元素添加到 pair vector
中,然后根据值对向量进行排序,但我不想添加具有相同值的元素,而且我不知道如何制作这样的 if 语句。
地图包含单词在 main()
的输入中重复的次数和单词本身,我想对具有地图元素的向量进行排序,但我不想重复单词已重复相同次数。
这是我目前拥有的:
bool compara(pair<string, unsigned int>& a,
pair<string, unsigned int>& b)
{
return a.second > b.second;
}
void sortP(map<string, unsigned int> &M, unsigned int x)
{
vector<pair<string, unsigned int> > A;
for (auto& it : M) {
if(find(A.begin(), A.end(), it.second) == A.end()) // this is the part that
A.push_back(it); // doesn't work
}
sort(A.begin(), A.end(), compara);
for (auto& it : A) {
cout << it.second << "\t"
<< it.first << endl;
}
cout << endl << endl;
// this is where i want to output the element of the vector that appears on the 'x'
// position, after it was sorted
}
如果术语不完全正确,我深表歉意,我刚刚开始习惯使用 maps
和 pairs
。
由于您正在搜索 vector
个 pair
,因此您需要使用 std::find_if()
而不是 std::find()
来查找 vector
元素匹配pair
的特定字段,例如:
for (auto& it : M) {
if (find_if(A.begin(), A.end(), [&](pair<string, unsigned int>& p){ return p.second == it.second; }) == A.end())
A.push_back(it);
}
或者,您可以只使用另一个 map
而不是 vector
,使用 it.second
作为键类型,并让 map
处理排序和复制为您处理。