我试图通过首先将字符转换为字符串来将字符插入字符串向量,但是情况1不起作用但是情况2正在工作。有人可以解释一下这种行为。将char直接插入向量的任何解决方法?
int
PS - 我正在使用C ++ 14
答案 0 :(得分:1)
此代码编译并运行:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
// vector of strings
vector<string> out;
// a character
char ch;
// assign some value to ch and push to vector
// Case 0: works because a const char * can be coerced into a string
out.push_back("");
// Case 1: Does not work
// you can't add a const char * and a char.
// Some compilers coerce the char into an int and add that to the pointer
// producing undefined behavior (access to un-allocated memory)
// out.push_back("" + ' ');
// CASE 1a: Works, but I'm 'cheating' by
// explicitly constructing a string.
out.push_back(string("") + ch);
// Case 1b: Works using a different string constructor
// This is probably the best approach:
out.push_back(string(1, ' '));
// CASE 2: works
string str = "";
out.push_back(str + ch);
std::cout << "out contains " << out.size() << " entries" << std::endl;
return 0;
}
结果:
out contains 3 entries
答案 1 :(得分:1)
术语""
并不代表std::string
实例,而是const char*
字面值,因此当您向其添加ch
时,您正在执行指针运算,很可能接收编译器警告:
警告:数组下标高于数组边界
要push_back
char
作为std::string
到std::vector<std::string>
,只需执行以下操作:
std::vector<std::string> vec;
char ch = 'a';
vec.push_back(std::string()+ch); // construct empty std::string, add ch, push_back
答案 2 :(得分:1)
您的代码存在问题。 这是类型特征,它将帮助您检查名称是否为模板化类型:
/***Check if type is simple template***/
template <template<class...> class>
constexpr bool is_template_type()
{ return true; }
template <class>
constexpr bool is_template_type()
{ return false; }
通过这个,您可以检查vector
是否是用于创建变量的有效类型。所以:
static_assert(!is_template_type<vector>(),
"vector is not valid type for creating a variable");
导致编译失败,因为您无法创建class template
的变量。您必须指定TYPE
应存储的std::vector
。你的问题标题说:
字符串向量
所以你应该创建std::vector<std::string>
变量。
您的代码的另一个问题是:
"" + ch
。
你觉得它做什么? ""
类型为char const[1]
,ch
类型为char
。 char const[1]
可隐式转换为char const *
,因为您可以向指针添加整数值 - 它会编译。但这不是你想要的!
这是您在内存中的""
:
`\0' ? ? ? ? ? ? ...
/\
当您向ch
添加""
时,结果如下:
//ch is 5 for example
`\0' ? ? ? ? ? ? ...
/\
所以你用一些未指定的地址创建std::string
。实际上,访问数组越界是C ++中的Undefined Behavior。
您应该使用用户W.F.的std::string() + ch
或字符串文字语法。在他对你的问题的评论中发表。
也不要忘记初始化ch
,因为使用未指定的值也是未定义的行为。