GPU(CUDA)学习日记(六)------ vector,动态数组,引用,编程调试经验总结等一些比较琐碎的记录

      昨天,开发的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
 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++ )

{
    cout << *iter << endl;
}
在大多数情况下,你应该让 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()
{
 int i = 0, j = 0;


 vector< vector > Array( 10, vector(0) ); 

for( j = 0; j < 10; j++ )
 {
  for ( i = 0; i < 9; i++ )
  {
   Array[ j ].push_back( i );
  }
 }

 for( j = 0; j < 10; j++ )
 {
  for( i = 0; i < Array[ j ].size(); i++ )
  {
   cout << Array[ j ][ i ] << "  ";
  }
  cout<< endl;
 }
}

2)定义一个行列都是变化的数组。

#include
#include
#include

using namespace std;

void main()
{
 int i = 0, j = 0;

 vector< vector > Array;
 vector< int > line;
 for( j = 0; j < 10; j++ )
 {
  Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。
  for ( i = 0; i < 9; i++ )
  {
   Array[ j ].push_back( i );
  }
 }

 for( j = 0; j < 10; j++ )
 {
  for( i = 0; i < Array[ j ].size(); i++ )
  {
   cout << Array[ j ][ i ] << "  ";
  }
  cout<< endl;
 }
}
pop_back() 可以弹出最后一个元素
erase(iterator   it)可以删除指定位置的元素
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)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值