C++ 如何转换C++;向量到C型数组?
我有一个存储数组的类,我需要编写一个方法来返回指向该数组的指针,以便其他对象可以访问/修改它 在我的程序的旧版本中,我通过用C风格定义数组来实现这一点。也就是说,拥有一个私有元素C++ 如何转换C++;向量到C型数组?,c++,stdvector,C++,Stdvector,我有一个存储数组的类,我需要编写一个方法来返回指向该数组的指针,以便其他对象可以访问/修改它 在我的程序的旧版本中,我通过用C风格定义数组来实现这一点。也就是说,拥有一个私有元素bool*list,然后在构造函数中分配内存(并在析构函数中释放内存)。当时的方法非常简单: bool* MyClass::getList() { return list; } 现在,我决定重写代码并使用std::vector而不是经典数组。问题是,我还将上述方法修改为: bool* MyClass::getL
bool*list
,然后在构造函数中分配内存(并在析构函数中释放内存)。当时的方法非常简单:
bool* MyClass::getList() {
return list;
}
现在,我决定重写代码并使用std::vector
而不是经典数组。问题是,我还将上述方法修改为:
bool* MyClass::getList() {
return &(list[0]);
}
这似乎是将C++向量转换成C数组的标准方法。但是,我无法编译代码,出现以下错误:
error: taking address of temporary [-fpermissive]
error: cannot convert ‘std::vector<bool>::reference* {aka std::_Bit_reference*}’ to ‘bool*’ in return
错误:获取临时[-fppermissive]的地址
错误:无法将'std::vector::reference*{aka std::_Bit_reference*}'转换为'bool*'
谁能帮我解决这个问题,告诉我该怎么办
(我也读到另一个选择是使用<代码>列表.DATA())作为指针,但这只会与C++编译器的最新版本一起工作。我不确定这是不是一个好主意。 谢谢
bool* MyClass::getList() {
return &(list[0]);
}
这将适用于任何类型,但是
std::vector
有特殊的实现,其中8个元素存储在1个字节中,因此似乎不可能使用原始指针指向它 你的思维过程大体上是正确的,用指针指向第一个元素就足够了。但是,由于它是作为位集实现的。在C++标准委员会和图书馆工作组之间普遍存在一个共识:“代码>向量<代码>应该被删除,随后从标准库中删除,而功能将以不同的名称重新引入。但现在它仍然存在
回到您的问题上来,您无法真正将位集解释为布尔数组。因此,有两种可能的方法:
size()
预先分配内存,然后迭代向量并填充数组bool数组[100];
std::vector;
复制(vector.begin(),vector.end(),数组);
std::vector
使用一个内部模型,其中每个bool存储为单个位。这意味着它在内部不是您想要的普通C数组,您无法轻松地将其转换为一个
用std::deque
替换std::vector
,并且不要使用deque部分,这将产生预期的行为
另一种解决方案是使用
std::vector
,并将值视为布尔值。只要在访问时正确地转换值,这将提供预期的行为。请记住,std::vector
是std::vector
的一个特化,它的工作方式与普通向量不同。看,例如……哦!谢谢你的评论。我想问题在于它不一定要将数据存储在一个连续的内存块中。那么解决方案是什么呢?(原则上,我并不坚持使用指针(bool*
)作为访问列表的接口。我只是认为这需要对代码的其他部分进行最少的修改)。您可以始终在堆上分配一个新的“数组”,从向量复制到数组,然后返回数组。但是调用方必须释放数组。谢谢,但是由于列表很大,我不想在复制上浪费时间。这只是一个简单的过程。只有当向量中有几十万个以上的条目时,才会引起注意。这很容易受到缓冲区溢出攻击,并且生成的数组不能用作返回值。@Hampunilsson这就是向量更好的原因。
bool array[100];
std::vector<bool>;
std::copy(vector.begin(), vector.end(), array);