簡體   English   中英

C++ 將字符串數組拆分為子組

[英]C++ Splitting array of strings into subgroups

我有一個字符串數組(長度總是不同),我需要將它分成幾組(有時數字也不同);

int main()
{
    // Array that I want to split;
    void Names = { Sara, Kaya, Hya, Jenny, Mary, Tiffany, Stefan };

    int groupNumber = 3;

    //Now I would like to split the names into 3 different groups as evenly as
    //possibile so that I can print
    // Group 1 : Sara,Hya,Jenny;
    //Group 2 : Kaya,Mary;
    //Group 3 : Tiffany, Stefan;
}

這是一個將數組拆分為多個組的示例代碼。 我希望它有助於開始。

int groupNumber = 3;
std::vector<std::string> names = { "Sara", "Kaya", "Hya", "Jenny", "Mary", "Tiffany", "Stefan" };
std::vector<std::vector<std::string>> groups;
groups.resize(groupNumber);
for (int i= 0; i < names.size(); ++i)
{
    groups.at(i % groupNumber).push_back(names.at(i));
}

您可以使用此循環打印出組。

for (auto group : groups)
{
    for (auto name : group)
    {
        std::cout  << name << " , ";
    }
    std::cout << std::endl;
}

Output

#include <iostream>
#include <array>
#include <vector>

using std::cout;

template <typename T>
std::ostream& operator <<(std::ostream& stream, const std::vector<T>& vec) {
    stream << "{";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        if (it != vec.begin()) stream << ", ";
        stream << *it;
    }
    stream << "}";
    return stream;
}

template <size_t GroupN, typename T> // T can be deduced
std::array<std::vector<T>, GroupN> split_vector(std::vector<T> vec_to_split) {
    std::array<std::vector<T>, GroupN> result;
    size_t remaining = vec_to_split.size();
    size_t optimal_size;
    
    for (size_t i = 0; i < GroupN; ++i) {
        optimal_size = (remaining + GroupN - i - 1) / (GroupN - i);
        // ceiling division, 7/3->3, 4/2->2, 2/1->2
        result[i].reserve(optimal_size);
        for (size_t j = vec_to_split.size() - remaining; j < vec_to_split.size() - remaining + optimal_size; ++j)
            result[i].push_back(vec_to_split[j]);
        remaining -= optimal_size; // 7-3=4, 4-2=2, 2-2=0
    }
    
    return result;
}

int main() {
    std::vector<int> v {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
    auto [v1, v2, v3] = split_vector<3>(v); // Structured binding, C++17 or above only
    cout << v1 << ", " << v2 << ", " << v3 << "\n";
    return 0;
}

頂部 function 只是std::vector的漂亮打印機,因為它們默認不可打印。 我使用int而不是std::string ,但這沒關系,

主 function 返回一個數組,因此它的大小在編譯時作為模板參數給出。

暫無
暫無

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

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