C++ 在std::set中打印的垃圾值
我编写了下面的简单程序,以找出两个输入字符串C++ 在std::set中打印的垃圾值,c++,stl,set,C++,Stl,Set,我编写了下面的简单程序,以找出两个输入字符串s和t之间不同的单个字符: class Solution { public: char findTheDifference(string s, string t) { std::set<char> set1; std::set<char> set2; int i=0; while(s[i]!='\0') { set1.insert(
s
和t
之间不同的单个字符:
class Solution {
public:
char findTheDifference(string s, string t) {
std::set<char> set1;
std::set<char> set2;
int i=0;
while(s[i]!='\0') {
set1.insert(s[i]);
i++;
}
i=0;
while(t[i]!='\0') {
set2.insert(t[i]);
i++;
}
std::set<char>::iterator it;
for(it=set1.begin(); it!=set1.end(); it++)
cout<<*it;
cout<<"\n";
for(it=set2.begin(); it!=set2.end(); it++)
cout<<*it;
cout<<"\n";
std::set<char> v;
std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(v, v.end()));
cout<<*(v.begin());
return *(v.begin());
}
};
函数返回的char
值为\x00
。我的问题是,这个垃圾值(\x00
)是从哪里打印和返回的?
谢谢你的帮助 您的程序调用UB,因为set2中的所有元素都存在于set1中,并且在std::set_差异调用之后,v中没有任何元素 从cpp.reference页面:
template
输出集_差(输入第一个1,输入最后一个1,
InputIt2 first2,InputIt2 last2,
先输出d_);
复制排序范围[first1,last1]中的元素,这些元素是
在排序范围[first2,last2]到范围开始处未找到
首先是迪乌
还有一些其他提示: 1) 最好将参数设置为常量引用 2) 可以直接使用范围构造函数从字符串构造集
3) 您可以使用copy和ostream_迭代器打印不带周期的集合。您的程序调用UB,因为set2中的所有元素都存在于set1中,而std::set_差分调用后v中没有元素 从cpp.reference页面:
template
输出集_差(输入第一个1,输入最后一个1,
InputIt2 first2,InputIt2 last2,
先输出d_);
复制排序范围[first1,last1]中的元素,这些元素是
在排序范围[first2,last2]到范围开始处未找到
首先是迪乌
还有一些其他提示: 1) 最好将参数设置为常量引用 2) 可以直接使用范围构造函数从字符串构造集 3) 您可以使用copy和ostream_迭代器打印集合,而不使用循环
cout<<*(v.begin());
,当容器为空时,您正在以未定义的行为冒险运行程序,正如begin()==end()
cout<<*(v.begin());
,当容器为空时(因此*(v.begin())
表现出未定义的行为),您的程序将面临未定义行为的风险。没有在set1
中存在但在set2
中不存在的元素。您可能希望使用std::set\u symmetric\u difference
v
为空(因此*(v.begin())
显示未定义的行为)。在set1
中没有元素,但在set2
中没有元素。您可能想使用std::set\u symmetric\u difference
是的,明白了!:)谢谢。一旦我能接受答案,我就会接受。是的,明白了!:)谢谢。一旦我能接受答案,我就会接受。
cout<<*(v.begin());
if(v.begin() != v.end())