转换为 short 时向量超出范围
vector out of range when converting to short
我有这个代码:
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
我该如何解决这个问题?
谢谢
你想做的可能是这样的:
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';
}
您正在将指向第一个和最后一个字符的指针传递给 std::vector
构造函数。指针应该指向第一个和最后一个字符之后的指针。由于您传递的两个指针之间的距离不是 short
的整数,因此代码具有未定义的行为。以下代码应该可以解决问题:
#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;
}
请注意,您不能使用 &cVec[cVec.size()]
,因为它也有未定义的行为。
我有这个代码:
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
我该如何解决这个问题?
谢谢
你想做的可能是这样的:
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';
}
您正在将指向第一个和最后一个字符的指针传递给 std::vector
构造函数。指针应该指向第一个和最后一个字符之后的指针。由于您传递的两个指针之间的距离不是 short
的整数,因此代码具有未定义的行为。以下代码应该可以解决问题:
#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;
}
请注意,您不能使用 &cVec[cVec.size()]
,因为它也有未定义的行为。