使用 std::begin 和 std::end 进行向量初始化
Vector initialization with std::begin and std::end
为什么可行?"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");
住
无论如何,你不应该依赖它,行为是不能保证的。
相关文章:
- std::向量与传递值的动态数组
- 如何在旧c++中初始化const-std向量
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 如何初始化 std::向量的映射?
- 迭代时将指向differents类型的指针保存在std::向量中
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- yaml-cpp到std::向量迭代的怪异行为
- 故意泄漏std::向量的内存
- 调整STD ::向量的大小是否可以降低其能力
- std ::向量距离函数如何给出比.size()更高的值
- C++ std::向量插入两个元素替代算法失败
- 错误:数字常数之前的预期无限制ID:std :: array和std ::向量大小分配
- 在我提供的此示例中,如何将2维std ::向量的逻辑更改为具有向量[row] [col] [col] [col] [co
- GUI滑块的动态数量,该数量更新具有回调中值的std ::向量
- 是一个std ::向量线程,我的目的是安全的
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- 将std ::向量作为指针参考
- STD ::向量如何调整其内部缓冲区大小
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区