c ++ vector如何更改内部指针

时间:2010-10-21 14:33:45

标签: c++ pointers vector internal

我想序列化矢量。我不知道如何改变矢量的指针.. 为了简单起见,假设我有一个类似的向量:

vector<char> v;

我有这个指针:

char* c = { 'v', 'e', 'c', 't', 'o', 'r' };

我希望我的矢量v的内部指针指向我的char * c:

&v[0] -> c 

如何调整指向c的向量?有什么办法吗?


编辑22.10.2010

所以伙计们, 在调试向量后,我想出了这个解决方案:

vector<char> dump;
memcpy(&myVector, &dump, sizeof(myVector)); // I change contents so it can work
myVector.assign(buf, buf+5); // copy contents into it from buffer (I don't like this part)

为了解决这个问题,我需要定义

_ITERATOR_DEBUG_LEVEL=0

因为它最初设置为2并且它实际上进行了调试检查(我猜)这在发布模式中也没有定义吗?所以这是我现在的解决方法,我想强制ppl长期删除矢量...那么大家你在考虑这个解决方案?你看到危险吗?


我实际上需要通过memcpy序列化vector。我希望序列化我的整个类(比如拍摄内存快照)并将其写入文件,并在重新加载时从文件中读取它并恢复对象,而不调用其构造函数并使用new运算符。

这个向量容器正在堆栈内存上发生,所以memcpy无法访问它,因为它只关心堆...这段代码现在可能对我有用了:

copy(buf,buf + 5 myVvector.begin());

这也不行,因为我不在我的班级上使用new关键字,据我所知,这个向量没有被初始化。因此,如果我尝试复制,使用smt push_back_fill这个向量,它会给我这个错误:

newDel.exe中0x00ec455b处的未处理异常:0xC0000005:访问冲突读取位置0x00654b4c。

这是有道理的...所以任何人都知道如何从外部调用vector的构造函数/初始化?

6 个答案:

答案 0 :(得分:4)

如果你有

vector<char> foo;

foo.push_back( 'v' );
foo.push_back( 'e' );
foo.push_back( 'c' );
foo.push_back( 't' );
foo.push_back( 'o' );
foo.push_back( 'r' );

char *c = &foo[0];

这使得指针指向向量内容的第一项。在您尝试调整矢量大小之前,这将保持有效。

修改

你可以这样做你想做的事情:

copy( c, c+6, back_inserter( myVector ) );

来自copy的{​​{1}}来电和来自algorithm的{​​{1}}来函。

答案 1 :(得分:3)

没有标准的方法可以做到这一点。你可以深入研究一个给定的实现,看看如何处理它(虽然可能没有办法),但如果你的库被更改或更新,你的技巧可能会失败。图书馆作者通常认为不需要支持此类用途。

vector<>是一个容器类。它不是C风格数组的包装器,尽管它在内部维护一个。它的行为和性能由标准指定,但不是其内部(除了其内容必须存储在连续的内存中)。图书馆作者利用这种自由来做出最佳实施。

假设您可以分配给内部指针。无疑指向免费存储的内存,但它可能不指向内存的开头,来自newmalloc()的返回值。内存的大小必须至少足以容纳容量乘以元素的大小,但事实上它可能更大。 vector<>可能依赖于其内容是特定池的一部分,或者以特定方式分配和释放。分配可能会影响vector<>的其他数据成员,例如可能指向.end()的指针。在任何这些情况下,如果不知道确切的实现,就无法自己管理内存和变量。

一般而言,干预实现内部是容易出错的,并且可能会随着库的任何更改而破坏,无论是否有直接明显的影响。它也不经常是必要的,甚至是不可取的。找到另一种序列化载体的方法。

答案 2 :(得分:0)

如果它是“内部”,那么probalby不要被篡改!

答案 3 :(得分:0)

这会对你有用吗?

vector<char*> v;
char* c = { 'v', 'e', 'c', 't', 'o', 'r' };  
v.push_back(c);

答案 4 :(得分:0)

如果您为I / O缓冲区使用另一个向量,则可以使用std::swap更改内容(它将更新指针以及其他适当的数据,例如存储计数的位置)。 / p>

答案 5 :(得分:0)

我看到了你自己的答案(不应该将答案作为答案发布,它应该被编辑成问题)。所以你想在C ++中进行序列化。放弃memcpy并使用适当的序列化工具,例如boost :: serialization。这不好,但这是必要的。否则,它将无法正常工作--C ++不会那样工作。