使用 std::begin 和 std::end 进行向量初始化

Vector initialization with std::begin and std::end

本文关键字:std 向量 初始化 begin 使用 end      更新时间:2023-10-16

为什么可行?"testString"有两个不同的字符串,但矢量大小分配正确。

#include <iostream>
#include <vector>
#include <iterator>
int main()
{
    std::vector<char> str;
    str.assign(std::begin("testString"), std::end("testString"));
    copy(str.begin(), str.end(), std::ostream_iterator<char>(std::cout, " "));
    std::cout<<str.size();
    return 1;
}

你很幸运,编译器执行了字符串池优化。请注意,您所做的仍然是未定义的行为,并且使用不同的编译器或不同的编译器设置,您将不会那么幸运。不要再这样做了。

两个相同的文本字符串很可能在内存中组合成一个字符串,因此开始和结束引用相同的字符串。

不过,这仅在您的程序中"意外"有效......

这是一个有点相关的编译器如何合并相同的字符串文字C++

由于允许

编译器在一个地方存储在不同位置使用的相同字符串文本,因此很可能std::begin("testString")std::end("testString")实际上都引用同一个字符串。

标准不强制要求这样做,编译器可以将这两个字符串文本存储在不同的位置,这会破坏此代码。 仅仅因为它有效并不意味着您应该这样做。 我建议使用

std::vector<char> str;
const char [] chstr = "testString"
str.assign(std::begin(chstr), std::end(chstr));

或者更好

std::string str = "testString";
copy(str.begin(), str.end(), std::ostream_iterator<char>(std::cout, " "));

有两个不同的字符串"testString"

在您的情况下,它们是一样的。允许编译器为相等或重叠的字符串文本组合存储。

允许(但不是必需)编译器为相等或重叠的字符串文本组合存储。这意味着,当通过指针进行比较时,相同的字符串文本可能会也可能不会相等。

您可以通过以下方式检查它,

std::cout << std::boolalpha << ("testString"=="testString");

无论如何,你不应该依赖它,行为是不能保证的。