【问题标题】:Vector initialization with std::begin and std::end使用 std::begin 和 std::end 进行向量初始化
【发布时间】:2016-02-25 13:52:36
【问题描述】:

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

【问题讨论】:

  • 如果你找到任何满意的答案,你应该accept它。

标签: c++ vector string-literals


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    这仅适用于您的程序中的“意外”...

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        你可以检查一下,

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

        LIVE

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-04
          • 2017-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多