[英]Sorting of two vectors separately?
我必須制作一個使用以下兩個向量的程序: -
vector<double> age;
vector<string> name;
我分開拿他們的輸入。 我必須創建一個函數sort(),以便按字母順序對名稱進行排序,然后相應地重新組織年齡以匹配名稱。
請幫忙!!
如果您可以在struct
或等效內容中對它們進行分組,則可以為您sort
並用於間接的索引創建其他向量:
std::vector<double> ages = /**/;
std::vector<string> names = /**/;
// ages.size() == names.size()
std::vector<std::size_t> indexes(names.size());
std::iota(indexes.begin(), indexes.end(), 0u);
std::sort(indexes.begin(), indexes.end(), [&](std::size_t lhs, std::size_t rhs) {
return names[lhs] < names[rhs];
});
for (auto index : indexes) {
std::cout << names[index] << " has " << ages[index] << std::endl;
}
使用range-v3,您可以:
std::vector<double> ages = /**/;
std::vector<string> names = /**/;
auto zip = ranges::view::zip(names, ages);
ranges::sort(zip);
for (const auto& z : zip) {
std::cout << std::get<0>(z) << " " << std::get<1>(z) << std::endl;
}
如果sort函數接受兩個向量,最簡單的方法是將所有內容復制到std::set<std::pair<string,double>>
,它首先在名稱上排序,然后將排序的條目復制到輸入向量。 如果你不能使用集合,你可以自己使用矢量和排序。
原因是排序會改變順序,因此您會丟失兩個向量的條目之間的鏈接。 如果您不能或不會使用組合set方法,則需要確保鏈接以另一種方式維護,可能通過帶引用的臨時容器。
假設你確實需要一個帶兩個向量並修改它們的函數。
sort函數可以實現為:
void sort ( vector<double>& ages, vector<string>& names)
{
if ( ages.size() != names.size() )
return;
std::map< string, double > helper_map;
for ( size_t id = 0; id < names.size(); ++id)
{
helper_map.emplace( names[id], ages[id] );
}
names.clear();
ages.clear();
for (const auto& helper : helper_map)
{
names.push_back( helper.first );
ages.push_back( helper.second );
}
}
工作示例: http : //coliru.stacked-crooked.com/a/2457c832c0b612b2
但請記住,應使用評論中指出的不同方法解決此問題。 作為家庭作業,這些東西並不總是適用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.