Ath*_*lha 2 c++ pointers iterator vector
vector.data()应该返回一个指向第一个元素的指针,但是当我在 a 上使用它时vector<uint8_t>,它会返回其他内容:
int main() {
std::string myString = {"a b c all the way long"};
std::vector<uint8_t> myVec(myString.begin(), myString.end());
std::cout << myVec.data() << std::endl;
std::vector<int> anotherVec = {4,5,2,3};
std::cout<< anotherVec.data() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序打印:
int main() {
std::string myString = {"a b c all the way long"};
std::vector<uint8_t> myVec(myString.begin(), myString.end());
std::cout << myVec.data() << std::endl;
std::vector<int> anotherVec = {4,5,2,3};
std::cout<< anotherVec.data() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么第一个打印显示所有向量,而第二个打印显示指针?我期待两者都打印一个指针。
真正的问题是,在另一个大程序上,当我用 打印时vector<uint8_t>.data(),cout它会在它后面打印垃圾(当我在调试器中查看它时,我没有看到垃圾)。
该data()函数返回一个指向第一个元素的指针。
myString是值向量uint8_t,因此data()将返回类型为 的值uint8_t*。uint8_t是基于 的类型char,因此<<流输出运算符会将其视为以 null 结尾的字符串。这里的问题是myVec不包含以 null 结尾的字符串,因此这在技术上是未定义的行为。
对于anotherVec,这是一个值向量int,这意味着data()返回类型为 的值int*,该值对于流输出运算符没有特定的重载<<。相反,它使用最接近的可能重载,即打印类型 的通用指针的重载void*。
如果您希望第一个打印指针本身,那么您需要将指针显式转换为void*:
std::cout << static_cast<void*>(myVec.data()) << '\n';
Run Code Online (Sandbox Code Playgroud)