エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

N個の要素に分割する

文字列とか配列とかを指定した個数に分割するもの。
あとで使う予定。まずは道具を研ぐのが主義。
最後の要素は端数になります。


まずはC++で。
イテレータのヴェクタを返します。分割したあとのm番目の要素の開始位置と終了位置がヴェクタの要素のm番目とm+1番目に格納されます。


コード全体はこちら。


ヘッダファイル。というか関数テンプレートの実装。

#ifndef DVIDEINTO_H
#define DVIDEINTO_H

#include <vector>
#include <iterator>

template<typename Iterator>
std::vector<Iterator> divideInto(int n, Iterator begin, Iterator end)
{
    std::vector<Iterator> result;
    const int             length         = std::distance(begin, end);
    const int             partial_length = (length + n - 1) / n;

    for(Iterator i = begin; i < end; std::advance(i, partial_length))
    {
        result.push_back(i);
    }
    result.push_back(end);

    return result;
}

#endif//DVIDEINTO_H


試してみる。

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

#include "divideInto.h"

int main(int, char* [])
{
    std::string s = "12345678";

    std::vector<std::string::iterator> result = divideInto(3, s.begin(), s.end());

    for(int i = 0; i < result.size() - 1; ++i)
    {
        std::cout << std::string(result[i], result[i + 1]) << std::endl;
    }

    return 0;
}


結果はこんな感じ。

$ ./divideIntoTest 
123
456
78