boost库中ublas::vector如何用C风格数组初始化?

helloyesterday 2013-03-20 08:02:36
本人最近在研究Boost程序库,因为用向量计算比较多,想试着用ublas::vector代替std::vector,首先的一个问题就是ublas::vector类型和std::vector相互转换。后者转换为前者没有问题:
ublas::vector<int> a(3,0);
std::vector<in> b(a.begin(),a.end());

但是反过来就不行,翻了半天源代码发现如果在声明ublas::vector的时候为再加上std::vector的类型就可以直接拿来初始化:
std::vector<in> a(3,0);
ublas::vector<int,std::vector<int> > b(a);

第一个问题解决之后马上面临第二个问题,那就是因为我现在在用着的一个库只能导出C风格的数组,于是我想知道如何用C风格的数组来初始化ublas::vector。众所周知用C风格数组初始化std::vector很简单,比如:
int a[]={1,2,3,4,5};
std::vector<int> b(a,a+5);

但是用同样的方法是无法初始化ublas::vector的。今天研究了一下午,翻源代码+网上搜索始终没有找到满意的解决方案。网上的说法无非就是给定初始化大小之后之后再赋值,或者不初始化用别的函数插入数值,但我觉得总觉得那些方法太臃肿(确切的说我觉得那些根本不叫初始化),很想知道有没有简单、直接、清晰的方式直接初始化。目前我想到只能是借助std::vector:
int a[]={1,2,3,4,5};
ublas::vector<int,std::vector<int> > b(std::vector<int>(a,a+5));

但是这样显然是太罗嗦,而且还是不太直接。所以我想请教熟悉Boost的大牛们这个问题该如何解决?
PS:在源代码中我发现有这样一个复制构造函数:
template<class AE>
vector (const vector_expression<AE> &ae)

研究了半天始终也没搞清出这个构造函数该怎么用,只知道这个vector_expression类型貌似是跟迭代器范围有关,所以我怀疑这个可能可以解决我的问题,但关键是查了半天也不知道这个vector_expression类型该怎么用。请大牛们顺便也解答一下,谢谢了!
...全文
398 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloyesterday 2013-03-29
  • 打赏
  • 举报
回复
引用 8 楼 helloyesterday 的回复:
引用 7 楼 akirya 的回复:引用 6 楼 helloyesterday 的回复:引用 5 楼 akirya 的回复:引用 4 楼 helloyesterday 的回复:引用 3 楼 akirya 的回复:引用 1 楼 helloyesterday 的回复:在高手云集的CSDN怎么连这么个基本问题也木有人回答啊,加一下悬赏分,再自己顶一下,各位大神帮帮忙啊! 1 ……
我刚刚试了一下下面的代码:

int a[]={1,2,3,4,5};
std::vector<int> b={a,a+5};
同样可以将数组a中的五个数都赋值给b,也就是说,像下面这种写法:

int a={1,2,3,4,5};
ublas::vector<int,std::vector<int> > b({a,a+5});
ublas::vector<int,std::vector<int> > c(std::vector<int>(a,a+5));
对于b和c的初始化方式应该是等价的。其实我现在很想知道的是,这种初始化方式和先分配大小再赋值的效率哪个更高些:

int a={1,2,3,4,5};
ublas::vector<int,std::vector<int> > b({a,a+5});
ublas::vector<int,std::vector<int> > c(5);
std::copy(a,a+5,c.begin());
helloyesterday 2013-03-29
  • 打赏
  • 举报
回复
引用 7 楼 akirya 的回复:
引用 6 楼 helloyesterday 的回复:引用 5 楼 akirya 的回复:引用 4 楼 helloyesterday 的回复:引用 3 楼 akirya 的回复:引用 1 楼 helloyesterday 的回复:在高手云集的CSDN怎么连这么个基本问题也木有人回答啊,加一下悬赏分,再自己顶一下,各位大神帮帮忙啊! 1 csdn是菜鸟大本营,没啥高手的 ……
代码:

int a={1,2,3,4,5};
ublas::vector<int,std::vector<int> > b({a,a+5});
cout<<b<<endl;
用gcc4.7编译(编译的时候还要加上-std=c++11)成功,输出结果:

[5](1,2,3,4,5)
输出的是5维的数组,证明确实是可行的。说实话的我也是第一次才知道统一初始化列表还可以这么用,试了才知道确实可以的。而且初始化列表还必须放在括号中,如果这样写:

int a={1,2,3,4,5};
ublas::vector<int,std::vector<int> > b={a,a+5};
编译是不会通过的,不知道这是什么原理。
  • 打赏
  • 举报
回复
引用 6 楼 helloyesterday 的回复:
引用 5 楼 akirya 的回复:引用 4 楼 helloyesterday 的回复:引用 3 楼 akirya 的回复:引用 1 楼 helloyesterday 的回复:在高手云集的CSDN怎么连这么个基本问题也木有人回答啊,加一下悬赏分,再自己顶一下,各位大神帮帮忙啊! 1 csdn是菜鸟大本营,没啥高手的 2 这问题不基本,C/C++版 没几个boost相关……
ublas::vector<double,std::vector<double> > b({a,a+5}); 这个是只有2个元素的数组....不是5个元素.
helloyesterday 2013-03-26
  • 打赏
  • 举报
回复
引用 5 楼 akirya 的回复:
引用 4 楼 helloyesterday 的回复:引用 3 楼 akirya 的回复:引用 1 楼 helloyesterday 的回复:在高手云集的CSDN怎么连这么个基本问题也木有人回答啊,加一下悬赏分,再自己顶一下,各位大神帮帮忙啊! 1 csdn是菜鸟大本营,没啥高手的 2 这问题不基本,C/C++版 没几个boost相关的问题,更不要说不常用的numeri……
哎呀,谢谢您的提醒,问题解决了!我只要生命的时候把std::vector当作第二个参数就行了,因为还要涉及到一些和std::vector的转化,这样声明对我来说是很有必要的:

double a[]={1,2,3,4,5};
ublas::vector<double,std::vector<double> > b({a,a+5});
试了一下果然可以!实在是太感谢您了!
  • 打赏
  • 举报
回复
引用 4 楼 helloyesterday 的回复:
引用 3 楼 akirya 的回复:引用 1 楼 helloyesterday 的回复:在高手云集的CSDN怎么连这么个基本问题也木有人回答啊,加一下悬赏分,再自己顶一下,各位大神帮帮忙啊! 1 csdn是菜鸟大本营,没啥高手的 2 这问题不基本,C/C++版 没几个boost相关的问题,更不要说不常用的numeric库了 3 换个支持C++11 Initializ……
ublas::vector<int>默认的时候是第二个参数是 boost::numeric::ublas::unbounded_array。这个类没有针对初始化列表的构造函数,std::vector有所以只能这么写
numeric::ublas::vector<int> vec({1,2,3,4,5});
helloyesterday 2013-03-25
  • 打赏
  • 举报
回复
引用 3 楼 akirya 的回复:
引用 1 楼 helloyesterday 的回复:在高手云集的CSDN怎么连这么个基本问题也木有人回答啊,加一下悬赏分,再自己顶一下,各位大神帮帮忙啊! 1 csdn是菜鸟大本营,没啥高手的 2 这问题不基本,C/C++版 没几个boost相关的问题,更不要说不常用的numeric库了 3 换个支持C++11 Initializer lists的编译器 ,应该就可……
前辈谦虚了。话说我是因为看到说Boost基本上成了C++的“准标准库”了才开始涉猎一些内容的,至于ublas::vector,我觉得至少在数值运算方面比std::vector用起来方便多了。如果ublas::vector是继承自std::vector的话就完美了。C++11的新代码我现在偶尔也用一下,但基本上也就限于auto之类的基本应用就是了,手头的GCC4.7至少还是支持一部分C++11新特性的。但是统一初始化列表可以用C风格数组做输入参数吗?我试了一下:

int a[]={1,2,3,4,5};
ublas::vector<int> b={a,a+5}; 
貌似不行啊。请前辈指教一下该怎么写,多谢了!
  • 打赏
  • 举报
回复
引用 1 楼 helloyesterday 的回复:
在高手云集的CSDN怎么连这么个基本问题也木有人回答啊,加一下悬赏分,再自己顶一下,各位大神帮帮忙啊!
1 csdn是菜鸟大本营,没啥高手的 2 这问题不基本,C/C++版 没几个boost相关的问题,更不要说不常用的numeric库了 3 换个支持C++11 Initializer lists的编译器 ,应该就可以用初始化列表来初始化了
tofu_ 2013-03-23
  • 打赏
  • 举报
回复
倒是想帮忙,无奈出差在外,手头没有boost源码。下载速度可怜的4k。
helloyesterday 2013-03-23
  • 打赏
  • 举报
回复
在高手云集的CSDN怎么连这么个基本问题也木有人回答啊,加一下悬赏分,再自己顶一下,各位大神帮帮忙啊!

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧