Код: Выделить всё
struct PhiBlock
{
int64_t bsize; // block size
vector ind; // 0/1 to track [pmin(y) > pb]
fenwick_tree phi_sum; // partial sums
PhiBlock (int64_t bsize, int64_t a):
phi_sum(ind)
{
this->bsize = bsize;
ind.resize(bsize, 1);
phi_sum = fenwick_tree(ind);
}
// ...
Код: Выделить всё
struct fenwick_tree
{
size_t len; // 0-based len
std::vector t; // 1-based tree, indexes [1:len]
fenwick_tree(std::vector const &a)
{
len = a.size();
t.assign(len + 1, 0);
for (size_t i = 0; i < len; ++i)
add_to(i, a[i]);
}
// ...
};
- не имеет конструктора по умолчанию, поэтому мне приходится использовать инициализацию элемента phi_sum(ind), где ind по умолчанию создается как вектор, который должен быть пустым.
Код: Выделить всё
fenwick_tree
< /li>изменяется.Код: Выделить всё
indРазмер - Новое fenwick_tree создается с использованием ind, затем phi_sum установлено на это значение, однако реализован оператор =.
Обновление: вот вывод gcc https://godbolt.org/z/5Y7Y9o15W
Мне трудно понять, что происходит, но, насколько я могу судить на основе вызовы:
- Первый оператор вызова new(unsigned long) предназначен для fenwick_tree.len
- Второй вызов std::vector::_M_fill_insert(__gnu_cxx::__normal_iterator, unsigned long, long const&) предназначен для ind.resize
- Третий и четвертый оператор вызова new(unsigned long ) и вызов memset предназначены для fenwick_tree.t
Подробнее здесь: https://stackoverflow.com/questions/793 ... onstructor
Мобильная версия