【问题标题】:vector out of range when converting to short转换为短时向量超出范围
【发布时间】:2021-07-09 07:19:57
【问题描述】:

我有这个代码:

int main()
{
    std::vector<unsigned char> cVec{ 'a','r','t','u' };
    std::vector<unsigned short>sVec;

    sVec = { reinterpret_cast<unsigned short*>(&cVec[0]), reinterpret_cast<unsigned short*>(&cVec[cVec.size()-1]) };
    for (auto i : sVec)
        std::cout << i << '\n';
    return 0;
}

但是当我运行它时,我有这个错误:

vector out of range

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 这是一种巨大的未定义行为。你到底想做什么? sVec 应该有 1、2 或 4 个元素?
  • 2 个元素。自然,它必须采用 ar 并将它们转换为其他 2 的简短相同
  • Char 为 1 字节,short 为 2 字节。您正在获取第一个元素的地址并将指向 char 的指针重新解释为指向 short 的指针,并对最后一个元素执行相同的操作?因此,不是在每个新地址都有一个元素,而是希望在每个其他内存地址都有一个元素,但仍然希望找到 4 个元素?向量不是协变的。您不能以这种方式将 vector 转换为 vector
  • @无用to see shorts containing two consecutive chars
  • @MariusBancila 我可以用什么方法来解决它?

标签: c++ vector reinterpret-cast


【解决方案1】:

您将指向第一个和最后一个字符的指针传递给std::vector 构造函数。指针应该指向第一个字符和最后一个字符之后的一个。由于您传递的两个指针之间的距离不是shorts 的整数,因此代码具有未定义的行为。下面的代码应该可以解决这个问题:

#include <vector>
#include <iostream>

int main()
{
    std::vector<unsigned char> cVec{ 'a','r','t','u' };
    std::vector<unsigned short>sVec;

    sVec = { reinterpret_cast<unsigned short*>(cVec.data()), reinterpret_cast<unsigned short*>(cVec.data() + cVec.size()) };
    for (auto i : sVec)
        std::cout << i << '\n';
    return 0;
}

请注意,您不能使用 &amp;cVec[cVec.size()],因为它也有未定义的行为。

【讨论】:

  • 感谢您的回答
  • 如果我使用花车,它会是一样的吗? std::vector&lt;float&gt;sVec; sVec = { reinterpret_cast&lt;float*&gt;(cVec.data()), reinterpret_cast&lt;float*&gt;(cVec.data() + cVec.size()) };
  • 是的,来自reinterpret_cast的通常未定义的行为警告
【解决方案2】:

你想要做的可能是这样的:

int main()
{
   std::vector<unsigned char> cVec{ 'a','r','t','u' };

   unsigned short* ptr = reinterpret_cast<unsigned short*>(&cVec[0]);
   std::vector<unsigned short> sVec{ ptr, ptr + cVec.size() / sizeof(unsigned short) };
   for (auto i : sVec)
      std::cout << i << '\n';
}

【讨论】:

  • 为什么我不能执行以下操作:unsigned short* ptr1 = reinterpret_cast&lt;unsigned short*&gt;(&amp;cVec[cVec.size()]);std::vector&lt;unsigned short&gt; sVec{ ptr, ptr +ptr1 };
  • @Gigo cVec[cVec.size()] 具有未定义的行为,因为它超出了向量的范围
猜你喜欢
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多