簡體   English   中英

分別對兩個向量進行排序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM