簡體   English   中英

在C ++ 98中優化向量的過濾

[英]Optimizing filtering of a vector in C++ 98

我得到了以下任務:創建一個包含男人,女人和未知名稱的文本文件。 嘗試實現一個過濾器,將那些名稱與真實名稱進行比較(因此,總共輸入了3個文件:男性,女性,比如說房客)。 過濾時,將匹配的名稱放入其適當的容器中。 在我看來,這很簡單,所以我按照下面提供的方式進行了操作。

我的問題是: 有沒有一種方法可以優化此代碼?

我試圖使用抽象類,並基於抽象實體創建4個不同的對象(男人,女人,已知,未知)。 但是對於這樣一個簡單的任務,代碼量仍然很大。 另一個想法是使用lambda表達式,但是我僅限於C ++ 98。

我想我想得太多了...

#include <fstream>
#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::ifstream men("resources/men_names.txt");
    std::ifstream women("resources/women_names.txt");
    std::ifstream renters("resources/renter_names.txt");

    std::vector<std::string> menNames;
    std::vector<std::string> womenNames;
    std::vector<std::string> renterNames;
    std::vector<std::string> knownRenters;
    std::vector<std::string> unknownRenters;

    std::string name;

    while (men >> name)
        menNames.push_back(name);

    men.close();

    while (women >> name)
        womenNames.push_back(name);

    women.close();

    while (renters >> name)
        renterNames.push_back(name);

    renters.close();

    std::vector<std::string>::iterator itMen;
    std::vector<std::string>::iterator itWomen;
    std::vector<std::string>::iterator itRenters;

    for (itRenters = renterNames.begin(); itRenters != renterNames.end(); itRenters++)
    {
        bool found = false;

        for (itMen = menNames.begin(); itMen != menNames.end(); itMen++)
        {
            if ((*itMen) == (*itRenters))
            {
                found = true;
                knownRenters.push_back((*itMen));
            }
        }
        if (!found)
        {
            for (itWomen = womenNames.begin(); itWomen != womenNames.end(); itWomen++)
            {   
                if ((*itWomen) == (*itRenters))
                {
                    found = true;
                    knownRenters.push_back((*itWomen));
                }
            }   
        }
        if (!found)
            unknownRenters.push_back((*itRenters));
    }

    std::cout << knownRenters.size() << '\n';
    std::cout << unknownRenters.size() << '\n';

    std::cin.get();

    return 0;
}

縮短現有代碼。 這應該都是C ++ 98

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <iterator>

int main()
{
    std::ifstream men("resources/men_names.txt");
    std::ifstream women("resources/women_names.txt");
    std::set<std::string> peopleNames;

    peopleNames.insert(std::istream_iterator<std::string>(men), std::istream_iterator<std::string>());
    peopleNames.insert(std::istream_iterator<std::string>(women), std::istream_iterator<std::string>());

    std::ifstream renters("resources/renter_names.txt");
    std::vector<std::string> knownRenters;
    std::vector<std::string> unknownRenters;

    for (std::string name; renters >> name; )
    {
        if (peopleNames.count(name))
            knownRenters.push_back(name);
        else
            unknownRenters.push_back(name);
    }

    std::cout << knownRenters.size() << '\n';
    std::cout << unknownRenters.size() << '\n';

    std::cin.get();

    return 0;
}

您不在乎租戶是男性還是女性,即使他們有公認的名字。 因此,請勿存儲兩個已知名稱的平面向量,而應存儲所有已識別名稱的單個std::set<std::string> (或排序后的向量,或者如果允許使用std::unordered_set話) C ++ 11)。

然后,您可以(僅對數時間)查找(對於C ++ 11版本為常數時間),而不是(每個租戶最多)進行兩次線性搜索。

您似乎也不必關心被認可(或未被認可)的房客的姓名,因此不要保留兩個結果向量:僅增加knownunknown計數器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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