Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何转换C++;向量到C型数组?_C++_Stdvector - Fatal编程技术网

C++ 如何转换C++;向量到C型数组?

C++ 如何转换C++;向量到C型数组?,c++,stdvector,C++,Stdvector,我有一个存储数组的类,我需要编写一个方法来返回指向该数组的指针,以便其他对象可以访问/修改它 在我的程序的旧版本中,我通过用C风格定义数组来实现这一点。也就是说,拥有一个私有元素bool*list,然后在构造函数中分配内存(并在析构函数中释放内存)。当时的方法非常简单: bool* MyClass::getList() { return list; } 现在,我决定重写代码并使用std::vector而不是经典数组。问题是,我还将上述方法修改为: bool* MyClass::getL

我有一个存储数组的类,我需要编写一个方法来返回指向该数组的指针,以便其他对象可以访问/修改它

在我的程序的旧版本中,我通过用C风格定义数组来实现这一点。也就是说,拥有一个私有元素
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++标准委员会和图书馆工作组之间普遍存在一个共识:“代码>向量<代码>应该被删除,随后从标准库中删除,而功能将以不同的名称重新引入。但现在它仍然存在

回到您的问题上来,您无法真正将位集解释为布尔数组。因此,有两种可能的方法:

  • 将std::vector替换为可以提供正确行为的
  • 需要时,手动将std::vector转换为C数组。例如,您可以使用
    size()
    预先分配内存,然后迭代向量并填充数组
  • 希望能有帮助。祝你好运

    试试string.copy():

    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);