PIVector and PIDeque: split and splitBySize
This commit is contained in:
@@ -2503,6 +2503,40 @@ public:
|
||||
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:
|
||||
inline void _reset() {
|
||||
pid_size = 0;
|
||||
|
||||
@@ -2421,6 +2421,40 @@ public:
|
||||
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:
|
||||
inline void _reset() {
|
||||
piv_size = 0;
|
||||
|
||||
Reference in New Issue
Block a user