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

时间:2016-02-25 13:52:37

标签: c++ vector string-literals

为什么可行?有两个不同的字符串"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;
}

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:2)

两个相同的文字字符串很可能在内存中合并为一个字符串,因此begin和end指的是相同的字符串。

这只适用于“意外事故”。在你的程序中虽然......

这是一个有点相关的How Do C++ Compilers Merge Identical String Literals

答案 2 :(得分:2)

由于允许编译器在一个地方存储在不同位置使用的相同字符串文字,因此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, " "));

答案 3 :(得分:2)

  

有两个不同的字符串“testString”

在你的情况下它们是一样的。允许编译器将存储组合为相等或重叠string literals

  

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

你可以查看,

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

LIVE

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