2016-01-13 2 views
1

Можно ли создать еще один конструктор BlockInputIterator, чтобы использовать перемещение вместо копии для std::vector?Переместить вместо копии для boost :: dynamic_bitset Конструктор BlockInputIterator?

Я считаю, что следующие виды использования конструктора копирования boost docs:

template <typename BlockInputIterator> 
dynamic_bitset(
    BlockInputIterator first, 
    BlockInputIterator last, 
    const Allocator& alloc = Allocator()); 

Вот код, который я написал, чтобы показать, что я спрашиваю:

#include <iostream> 
#include <vector> 
#include <boost/dynamic_bitset.hpp> 

using namespace std; 
using namespace boost; 

int main(int argc, char* argv[]) 
{ 
    // Notice the vector opposed to dynamic_bitset 
    vector<uint8_t> data; 

    // put in dummy data 
    data.push_back(0x1a); 
    data.push_back(0xcf); 
    data.push_back(0xfc); 
    data.push_back(0x1d); 
    for (auto i = data.begin(); i != data.end(); ++i) 
    { 
     cout << hex << (int)*i << dec << ' '; 
    } 
    cout << std; 
    cout << "data.data(): " << hex << (uint64_t)data.data() << dec << endl; 

    // I believe this is a copy opposed to a move 
    boost::dynamic_bitset<uint8_t> bs0(data.begin(), data.end()); 

    // I would like to be able to do this which would use move, 
    // is that possible considering the vector? 
    boost::dynamic_bitset<uint8_t> bs1 = data; 

    return 0; 
} 

Поэтому в основном я интересно, если импульс может добавить дополнительный конструктор в boost::dynamic_bitset, чтобы использовать перемещение вместо копии для std::vector?

+1

Не должно быть сложно предложить функцию и PR. Я бы, однако, знаю заранее, что они захотят разместить C++ 03 с BOOST_MOVE, и я не знаю, как его использовать. – sehe

+0

Да, я хотел предложить дополнительную библиотеку, но хотел убедиться, что это возможно даже в первую очередь. :) – bantl23

+1

Сначала это не просто (и с итераторами это не сработает, но я предполагаю, что вы не против переходить из контейнеров?) – sehe

ответ

3

За исключением случаев, когда vector получает изменения к своему интерфейсу.

См., Движение - очень интимная операция для объекта; поэтому для поддержки перемещения требуются функции-члены этого типа. Это не то, что вы можете навязать объекту снаружи.

vector не может принять произвольный буфер памяти, назначенный пользователем, в качестве внутреннего хранилища. Теоретически это может потребоваться с помощью некоторых средств, но в настоящее время нет такого интерфейса. Без такой поддержки другой код не может дать std::vector свою память.

Boost может быть в состоянии дать boost::container::vector такой интерфейс. Но это не изменится std::vector.

Аналогичным образом, вы не можете скрывать память памяти std::vector. Ну, можно, но только с помощью распределителя. То есть, вам придется сказать распределителю, чтобы он фактически не освобождал выделение или уничтожал объекты, когда ему сказали сделать это vector. Это будет сложно, так как vector::get_allocator возвращает копию распределителя.

Конечно, dynamic_bitset не имеет никакого способа получить распределение; он ожидает его владеть. Очень нравится vector. Таким образом, даже если вы можете скрыться с хранилищем std::vector, dynamic_bitset не может его принять.

+0

Мне было интересно, можно ли переместить 'std :: vector' в' boost :: dynamic_bitset' не наоборот, и я думаю, это то, что вы говорите. Я думал, что, поскольку конструктор инициализируется с помощью 'std :: vector', это займет это под ним и, таким образом, будет иметь такую ​​близость, которую вы описываете. – bantl23

+0

@ bantl23: Добавлено примечание об этом. –

+0

Спасибо за тщательный ответ! У меня был еще один вопрос. Если бы 'boost :: dynamic_bitset' был реализован путем наследования и/или инкапсуляции' std :: vector', тогда это было бы возможно? – bantl23

Смежные вопросы