PIVector and PIDeque: split and splitBySize
This commit is contained in:
@@ -2503,6 +2503,40 @@ public:
|
|||||||
return fl.reshape(rows, cols, order);
|
return fl.reshape(rows, cols, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! \~english Divides an array into a two-dimensional array using the separator `separator`.
|
||||||
|
//! \~russian Разделяет массив на двумерный массив с помощью разделителя`separator`.
|
||||||
|
inline PIDeque<PIDeque<T>> split(const T & separator) const {
|
||||||
|
PIDeque<PIDeque<T>> ret;
|
||||||
|
if (isEmpty()) return ret;
|
||||||
|
size_t start = 0;
|
||||||
|
ssize_t ci = indexOf(separator, start);
|
||||||
|
while (ci >= 0) {
|
||||||
|
ret << PIDeque<T>(pid_data + pid_start + start, ci - start);
|
||||||
|
start = ci + 1;
|
||||||
|
ci = indexOf(separator, start);
|
||||||
|
}
|
||||||
|
if (start < pid_size) {
|
||||||
|
ret << PIDeque<T>(pid_data + pid_start + start, pid_size - start);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \~english Divides an array into a two-dimensional array in chunks of no more than `sz`.
|
||||||
|
//! \~russian Разделяет массив на двумерный массив по кускам не более чем `sz`.
|
||||||
|
inline PIDeque<PIDeque<T>> splitBySize(size_t sz) const {
|
||||||
|
PIDeque<PIDeque<T>> ret;
|
||||||
|
if (isEmpty() || sz == 0) return ret;
|
||||||
|
size_t ch = pid_size / sz;
|
||||||
|
for (size_t i = 0; i < ch; ++i) {
|
||||||
|
ret << PIDeque<T>(pid_data + pid_start + sz*i, sz);
|
||||||
|
}
|
||||||
|
size_t t = ch*sz;
|
||||||
|
if (t < pid_size) {
|
||||||
|
ret << PIDeque<T>(pid_data + pid_start + t, pid_size - t);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline void _reset() {
|
inline void _reset() {
|
||||||
pid_size = 0;
|
pid_size = 0;
|
||||||
|
|||||||
@@ -2421,6 +2421,40 @@ public:
|
|||||||
return fl.reshape(rows, cols, order);
|
return fl.reshape(rows, cols, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! \~english Divides an array into a two-dimensional array using the separator `separator`.
|
||||||
|
//! \~russian Разделяет массив на двумерный массив с помощью разделителя`separator`.
|
||||||
|
inline PIVector<PIVector<T>> split(const T & separator) const {
|
||||||
|
PIVector<PIVector<T>> ret;
|
||||||
|
if (isEmpty()) return ret;
|
||||||
|
size_t start = 0;
|
||||||
|
ssize_t ci = indexOf(separator, start);
|
||||||
|
while (ci >= 0) {
|
||||||
|
ret << PIVector<T>(piv_data + start, ci - start);
|
||||||
|
start = ci + 1;
|
||||||
|
ci = indexOf(separator, start);
|
||||||
|
}
|
||||||
|
if (start < piv_size) {
|
||||||
|
ret << PIVector<T>(piv_data + start, piv_size - start);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \~english Divides an array into a two-dimensional array in chunks of no more than `sz`.
|
||||||
|
//! \~russian Разделяет массив на двумерный массив по кускам не более чем `sz`.
|
||||||
|
inline PIVector<PIVector<T>> splitBySize(size_t sz) const {
|
||||||
|
PIVector<PIVector<T>> ret;
|
||||||
|
if (isEmpty() || sz == 0) return ret;
|
||||||
|
size_t ch = piv_size / sz;
|
||||||
|
for (size_t i = 0; i < ch; ++i) {
|
||||||
|
ret << PIVector<T>(piv_data + sz*i, sz);
|
||||||
|
}
|
||||||
|
size_t t = ch*sz;
|
||||||
|
if (t < piv_size) {
|
||||||
|
ret << PIVector<T>(piv_data + t, piv_size - t);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline void _reset() {
|
inline void _reset() {
|
||||||
piv_size = 0;
|
piv_size = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user