昨天,开发的GPU程序终于调通了第二个部分,中间经历了学习CUDA框架和编程、设计系统框架、完成编程等过程。遇到了很多问题,其中包括:vector数组的resize问题,动态数组的堆栈损坏问题,函数引用与变量取地址的问题,不同工程之间调用DLL的问题,基于CUDA的底层工程生成静态库出错的问题,将.cu文件按照“CUDA C/C++”方式编译时只能选择“多线程DLL调试”的问题(说明CUDA依赖第三方库~),还有就是不同工程之间编译方式要一致的问题等等。这些问题都反映出自己的编程功力还不够,对于C++的运行机制以及一些比较基础的编程知识了解的还少,还需要再回炉一番~幸好自己还有时间可以给自己学习!
下面说一些有用的东西吧,首先是vector的一些简单的知识,找到一篇不错的文章:http://www.cnblogs.com/charley_yang/archive/2010/12/11/1903040.html ,更为详细的阐述应该看下面这一篇文章,很详细,很受益:http://blog.sina.com.cn/s/blog_4cd2484f010099wq.html
#include
#include
using namespace std;
int main()
{
vector vi;
int isbn;
while(true)
{
cout << "enter an ISBN; press 0 to stop ";
cin >> isbn;
if (isbn==0)
break;
vi.push_back(isbn); // insert element into vector
}
}
在 vector 对象构造期间,它先分配一个由其实现定义的默认的缓存大小。一般 vector 分配的数据存储初始空间是 64-256 存储槽(slots)。当 vector 感觉存储空间不够时,它会自动重新分配更多的内存。实际上,只要你愿意,你可以调用 push_back() 任何多次,甚至都不用知道一次又一次的分配是在哪里发生的。
存取 vector 元素,使用重载的 [] 操作符。
for (int n=0; n<vi.size();n++)
cout<<"ISBN: "<<vi[n]<<endl;
}
也可以用vi.begin()和vi.end() 来得到vector开始的和结束的元素地址的指针位置
vector::iterator iter;
for( iter = vi.begin(); iter != vi.end(); iter++ )
{
}
在大多数情况下,你应该让 vector 自动管理自己的内存,就像我们在上面程程序中所做的那样。但是,在注重时间的任务中,改写默认的分配方案也是很有用的。假设我们预先知道 ISBNs 的数量至少有 2000。那么就可以在对象构造期间指出容量,以便 vector 具有至少 2000 个元素的容量:
vector vi(2000); // 初始容量为 2000 个元素
除此之外,我们还可以调用 resize() 成员函数:
vi.resize(2000);// 建立不小于 2000 个元素的空间
这样,便避免了中间的再分配,从而提高了效率。
二维vector的定义
1)定义一个10个vector元素,并对每个vector符值1-10。
#include
#include
#include
using namespace std;
void main()
{
for( j = 0; j < 10; j++ )
}
2)定义一个行列都是变化的数组。
#include
#include
#include
using namespace std;
void main()
{
}
pop_back() 可以弹出最后一个元素
erase(iterator
clear()可以清空vector中的元素
这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了。
Vector总览
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用vector,必须在你的头文件中包含下面的代码:
#include |
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector; vector vInts; |
或者连在一起,使用全名:
std::vector vInts; |
建议使用全局的命名域方式:
using namespace std; |
在后面的操作中全局的命名域方式会造成一些问题。vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。
Vector成员函数
函数 |
表述 |
c.assign(beg,end) c.assign(n,elem) |
将[beg; end)区间中的数据赋值给c。 将n个elem的拷贝赋值给c。 |
c.at(idx) |