‘壹’ 怎么在C++中用Vector存放不同类型的数据..
namespace std {
template<class T,class A = allocator<T> > struct vector {
typedef typename A::value_type value_type;
typedef typename A::reference reference;
typedef A allocator_type;
typedef typename A::pointer pointer;
typedef typename A::size_type size_type;
// ...
explicit vector() throw() : sz(0), random_ptr() { }
// ...
void push_back(const value_type& v) {
!random_ptr ? random_ptr = new T(v): new(random_ptr+sz) T(v);
sz++;
}
reference operator[](size_type ind) { return *(random_ptr+ind); }
size_type size() const { return sz; }
// ...
private:
size_type sz;
pointer random_ptr;
};
}
在此我并没有考虑到push_back()牵涉到的reserve(),只是大致上如此。如果你要想这段代码能在main()下运行,请定义一个合适的析构函数。
‘贰’ c++中vector的存储问题
c++中的stl除了平常使用的vector、map之类的还有一个组件叫Allocator。其实是stl各类数据结构中统一的负责内存分配的组件。Allocator很少被显示的调用,但其实各类stl数据结构在初始化的时候都支持显示的指定Allocator组件。各类结构中的size和capacity函数数量的不一致就是Allocator导致的。size是当前容器中元素的数量。capacity是当前容易能够容纳元素的数量。其中capacity的变化就是Allocator重新申请内存导致的。所以说stl的容器实际上都是逻辑概念,他们实现仅仅是相应数据结构的使用方法,并不涉及真正的内存组织结构,内存住址结构都是由Allocator实现的。也就是说vector叫顺序表、list是链表,但实际上在内存上list也可能是顺序的,只不过list实现了链表的相应功能而已。
‘叁’ C++如何用vector实现存放4行4列的,然后再在3行3列的数据,3行3列的数据放在4行4列数据的下面
给你写一个代码看看,不想测试,看看思想。关键是vector<vector<int>>
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv)
{
vector<vector<int>> theVec;
vector<int>* pVec;
pVec = new vector<int>();
pVec->push_back(4);
pVec->push_back(5);
pVec->push_back(6);
pVec->push_back(7);
theVec.push_back(*pVec);
pVec = new vector<int>();
pVec->push_back(2);
pVec->push_back(4);
pVec->push_back(3);
pVec->push_back(8);
theVec.push_back(*pVec);
pVec = new vector<int>();
pVec->push_back(5);
pVec->push_back(3);
pVec->push_back(1);
pVec->push_back(0);
theVec.push_back(*pVec);
pVec = new vector<int>();
pVec->push_back(1);
pVec->push_back(6);
pVec->push_back(2);
pVec->push_back(9);
theVec.push_back(*pVec);
pVec = new vector<int>();
pVec->push_back(6);
pVec->push_back(3);
pVec->push_back(4);
theVec.push_back(*pVec);
pVec = new vector<int>();
pVec->push_back(2);
pVec->push_back(7);
pVec->push_back(9);
theVec.push_back(*pVec);
pVec = new vector<int>();
pVec->push_back(0);
pVec->push_back(8);
pVec->push_back(1);
theVec.push_back(*pVec);
return 0;
}
关键在于你应该理解vector是一个动态数组,可以动态分配大小,push_back操作是最基本的操作。这样的实现不只适用于你所说的那个数据结构,任何以二维数组为标准的数据结构均可用vector来实现
‘肆’ 在c++中使用vector把大于0的数储存下来,如何编写这段代码
vector<int>vec_data;
if(number>0)
{
vec_data.push_back(number);
}
‘伍’ 关于c++ vector
你用的是VS2010来测试的,所以输出和你预想的不一样,如果你用的是VC6,输出和你想象的就一样了。
在VC6里面用的vector,iterator的实现很简单,就是个指针:
typedef _Ty _FARQ *pointer;
typedef _A::pointer _Tptr;
typedef _Tptr iterator;
可以看到,iterator它就是个指针,所以,如果在VC6里面测试,输出是对的
而在VS2010里面,iterator就不是个指针了,而是个类:
typedef _Vector_iterator<_Mybase> iterator;
可以看到,iterator其实是个模板类对象。所以,按照你的输出结果就不对了。
至于你说的第4点,end()返回的迭代器指向的是元素结束的下一个位置,两种写法都对。
附VC6下面的测试截图:
可以看到,输出和你原来的预想是一样的。VS2010里面就不一样了。
关于你补充的:
对于作用于对象上的++操作符,你不能相当然认为就是加在对象本身上,还是得从vector源代码找原因,通过看VS2010 vector的代码发现,++操作符是重载过的,代码如下:
_Myiter& operator++()
{ // preincrement
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Getcont() == 0
|| this->_Ptr == 0
|| ((_Myvec *)this->_Getcont())->_Mylast <= this->_Ptr)
{ // report error
_DEBUG_ERROR("vector iterator not incrementable");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE(this->_Getcont() != 0);
_SCL_SECURE_VALIDATE_RANGE(
this->_Ptr != 0
&& this->_Ptr < ((_Myvec *)this->_Getcont())->_Mylast);
#endif /* _ITERATOR_DEBUG_LEVEL */
++this->_Ptr;
return (*this);
}
可以看到,这个++操作符是作用在迭代器内部的一个指针上面的,而不是作用于迭代器本身。
另外,其它的操作符像*(解引用)也是重载过的,所以,你按照自己的想法来输出的时候,可能会比较奇怪,这些你要从源代码来分析。
‘陆’ java集合类vector如何存储数据 具体该如何使用 我是新手,谢谢
ArrayList会比Vector快,他是异步的,如果设计涉及到多线程,还是用Vector比较好一些
import java.util.*;
/**
* 演示Vector的使用。包括Vector的创建、向Vector中添加元素、从Vector中删除元素、
* 统计Vector中元素的个数和遍历Vector中的元素。
*/
public class VectorDemo{
public static void main(String[] args){
//Vector的创建
//使用Vector的构造方法进行创建
Vector v = new Vector(4);
//向Vector中添加元素
//使用add方法直接添加元素
v.add("Test0");
v.add("Test1");
v.add("Test0");
v.add("Test2");
v.add("Test2");
//从Vector中删除元素
v.remove("Test0"); //删除指定内容的元素
v.remove(0); //按照索引号删除元素
//获得Vector中已有元素的个数
int size = v.size();
System.out.println("size:" + size);
//遍历Vector中的元素
for(int i = 0;i < v.size();i++){
System.out.println(v.get(i));
}
}
}
‘柒’ C++的vector存储数据的问题
如果你的指针内存空间分配在堆上,直接定义std::vector<TYPE*> v; v.push_back(p); //存放的是指针
如果分配在栈上,可以定义std::vector<TYPE> v; v.push_back(*p); //存放的是类的实例
‘捌’ c++ 关于用vector储存struct
for (vector<a>::iterator it = vec.begin(); it != vec.end(); ++it) {
it->b
}
‘玖’ C++vector的存储方式,是把数据赋值到堆中吗
放在栈里面的nInt.push_back(tmp);实际上放的是tmp的拷贝。你要是没有写拷贝构造函数默认的按位拷贝,这样不安全,你要是写了拷贝构造函数就按按照你的方法在复制。
‘拾’ c++中vector<string>可以存放什么数据
利用C++做信号处理方面的仿真,于是就涉及到了大量数据的存储。由于在读取数据的时候,并不知道数据的长度,这时候,vector就很好用了,因为vector容器不用知道数组的长度。
编写程序读入一组string类型的数据,并将它们存储在vector中,接着,把该vector对象复制给一个字符指针数组。为vector中的每个元素创建一个新的字符数组,并把该vector元素的数据复制到相应的字符数组中,最后把指向该数组的指针插入字符指针数组。
(10)vector存储方式代码扩展阅读
vector拷贝使用总结
1、利用拷贝赋值操作符(深复制)
vector<int> array{3,5,2,6,4};
vector<int> outArray;
outArray = array;
2、利用拷贝构造(深复制)
vector<int> array{3,5,2,6,4};
vector<int> outArray(array);
3、利用swap()函数(交换两个vector)
会清空原vector数组
vector<int> array{3,5,2,6,4};
vector<int> outArray;//设为空
outArray.swap(array);//清空array数组