2014-01-25 2 views
0

Предположим, что я хочу назначить список из трех чисел вектору v, так что v [0] - это первый элемент списка, v [1] - второй и v [2] в третьих. я узнал, что для стандартного векторного шаблона есть правопреемником библиотека повышенияНазначьте несколько чисел вектору boost

#include <boost/assign/std/vector.hpp> // for 'operator+=()' 
using namespace boost::assign; // bring 'operator+=()' into scope 

int main { 
    vector<int> values; 
    values += 1,2,3,4,5,6,7,8,9; // insert values at the end of the container 
} 

Теперь, когда я пытаюсь сделать это для повышающего вектора

boost::numeric::ublas::vector<int> values 
values += 1,2,3,4,5,6,7,8,9; 

он говорит мне «ни один оператор«+ = "соответствует этим операндам. Как это решить с помощью векторов повышения? (Я предполагаю, что это должно быть что-то простое, но я слишком глупый, чтобы это увидеть)

+0

Это ужасный синтаксис. для меня это не очень хорошо. –

+2

Вы действительно прочитали [документацию] (http://www.boost.org/doc/libs/1_55_0/libs/assign/doc/index.html#extensions)? – KillianDS

+0

«Я предполагаю, что это должно быть что-то простое, но я слишком глуп, чтобы его увидеть» - вам придется написать перегрузку «operator + =()», которая принимает соответствующие аргументы и возвращает соответствующий тип, подходящий для цепочки. Поскольку вы сочли некоторое понимание «boost», чтобы сделать это для вышеупомянутого, я ожидаю, что это может быть не так просто, как вы думаете. Плюс, как уже сказал Кароли, это ужасный синтаксис - должен быть более интуитивный способ сделать это. – thokra

ответ

0

Одним из способов сделать это может быть использование оператора вставки потока.

#include <boost/assign.hpp> 
#include <boost/assign/std/vector.hpp> // for 'operator+=()' 
#include <boost/assert.hpp> 
#include <boost/numeric/ublas/vector.hpp> 
#include <boost/numeric/ublas/assignment.hpp> 
#include <boost/numeric/ublas/io.hpp> 

using namespace std; 
using namespace boost::assign; // bring 'operator+=()' into scope 

int main() 
{ 
    boost::numeric::ublas::vector<int> values(9); 
    values <<= 1,2,3,4,5,6,7,8,9; 
    BOOST_ASSERT(values.size() == 9); 
    BOOST_ASSERT(values[0] == 1); 
    BOOST_ASSERT(values[8] == 9); 
    std::cout << values << std::endl; 
} 

Результат является то, что программа печатает:

[9](1,2,3,4,5,6,7,8,9) 

К сожалению, это будет дамп, если вы уже не имеете вектор размера надлежащим образом, так что потенциальный недостаток этого метода. Я изначально отправил ответ, который сказал использовать push_front(values) = 1,2,3,4,5,6,7,8,9;, но затем я попробовал его и был удивлен, узнав, что этот вектор ускорения не имеет ни оператора push_front, ни push_back.

Уродливой альтернативой было бы установить и использовать базовое представление данных ускорительного вектора, но это довольно хаки!

boost::numeric::ublas::vector<int, std::vector<int>> values; 
    push_back(values.data()) = 1,2,3,4,5,6,7,8,9; 

Это устанавливает базовое представление данных, чтобы быть std::vector<int>, а затем использует библиотеку подталкивания assign, чтобы сделать синтаксис во второй строке возможно.

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