C++ 将字符串数组拆分为子组

时间:2021-01-28 10:37:46

标签: c++ arrays split grouping divide

我有一个字符串数组(长度总是不同的),我需要把它分成几组(数字也不时不同);

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;
}

2 个答案:

答案 0 :(得分:0)

这是一个将数组拆分为多个组的示例代码。希望对入门有所帮助。

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

答案 1 :(得分:0)

#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;
}

top 函数只是 std::vector 的一个漂亮的打印机,因为它们默认是不可打印的。我用的是 int 不是 std::string,但没关系,

main 函数返回一个数组,因此它的大小在编译时作为模板参数给出。