C++ C+中的排序字符串+;don';不能正确比较吗?
基本上,我有两个列表。列表C++ C+中的排序字符串+;don';不能正确比较吗?,c++,string,comparison,string-comparison,C++,String,Comparison,String Comparison,基本上,我有两个列表。列表A包含术语,列表B包含已加扰的术语。我试图通过复制a来解读B,对其中的每个字符串进行排序,然后对B中的字符串进行排序,并将它们与排序后的a版本相匹配。然后我可以从排序后的A中提取索引,然后将相同的索引放入A中,找到原始索引 到目前为止,我的代码看起来很好,但是字符串之间永远不相等。我已经尝试了我所知道的各种形式的比较,现在我正在做str1.compare(str2)=0 我的代码: 我有向量行和向量关键字。然后我有向量排序\u kws,这是关键字,所有内容都已排序 //
A
包含术语,列表B
包含已加扰的术语。我试图通过复制a
来解读B
,对其中的每个字符串进行排序,然后对B
中的字符串进行排序,并将它们与排序后的a
版本相匹配。然后我可以从排序后的A
中提取索引,然后将相同的索引放入A
中,找到原始索引
到目前为止,我的代码看起来很好,但是字符串之间永远不相等。我已经尝试了我所知道的各种形式的比较,现在我正在做str1.compare(str2)=0
我的代码:我有
向量行
和向量关键字
。然后我有向量排序\u kws
,这是关键字
,所有内容都已排序
//查找匹配字符串
对于(int i=0;i cout很难准确地确定您想要做什么,但是如果您有两个已排序的向量,并且您想知道两者中的匹配项,那么您可以使用std::set_intersection()而不是循环
#include <algorithm>
#include <iterator>
#include <string>
#include <vector>
#include <iostream>
// assume v1 and v2 are sorted
typedef std::vector<std::string> StringVect;
StringVect getDifferences(const StringVect& v1,
const StringVect& v2)
{
StringVect theDiff;
std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
std::back_inserter(theDiff));
return theDiff;
}
int main()
{
StringVect v1;
v1.push_back("a");
v1.push_back("b");
v1.push_back("c");
StringVect v2;
v2.push_back("a");
v2.push_back("c");
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
StringVect dif = getDifferences(v1, v2);
std::copy(dif.begin(), dif.end(),
std::ostream_iterator<std::string>(std::cout, " "));
}
#包括
#包括
#包括
#包括
#包括
//假设v1和v2已排序
typedef std::vector StringVect;
StringVect获取差异(常量StringVect和v1,
const StringVect和v2)
{
StringVect theDiff;
std::set_交叉点(v1.begin(),v1.end(),v2.begin(),v2.end(),
标准:背向插入器(theDiff);
返回敌我;
}
int main()
{
StringVect v1;
v1.推回(“a”);
v1.推回(“b”);
v1.推回(“c”);
StringVect v2;
v2.推回(“a”);
v2.推回(“c”);
排序(v1.begin(),v1.end());
排序(v2.begin(),v2.end());
StringVect dif=getDifferences(v1,v2);
复制(dif.begin(),dif.end(),
std::ostream_迭代器(std::cout,“”);
}
输出为:
c如果看不到更多的代码,就很难(也就是说,不可能)准确地猜测问题所在。也就是说,让基本思想发挥作用是完全可能的
我想我应该定义一个类来存储字符串的原始形式和排序形式。当您进行比较时,它会根据排序形式进行比较,但当您将其写入流时,它会显示原始字符串:
class sorted_string {
std::string sorted;
std::string original;
public:
sorted_string(char const *input) :sorted(input), original(input) {
std::sort(sorted.begin(), sorted.end());
}
friend std::ostream &operator<<(std::ostream &os, sorted_string const &s) {
return os << s.original;
}
bool operator<(sorted_string const &other) const {
return sorted < other.sorted;
}
};
类排序\u字符串{
std::字符串排序;
std::原始字符串;
公众:
已排序字符串(字符常量*输入):已排序(输入),原始(输入){
std::sort(sorted.begin(),sorted.end());
}
friend std::ostream&operator解决了这个问题。当所有字符串都有愚蠢的“\r\n”
s时,我正在按“\n”
进行拆分。您是否尝试使用解块器?请发布一个最小但完整的示例来演示这个问题。
int main() {
// create two sets of input strings:
std::set<sorted_string> in1{ "xzy", "bac", "dffed", "iii", "iji" };
std::set<sorted_string> in2{ "yxz", "cab", "yyy", "ffedd", "iop" };
// print out the intersection based on sorted comparison:
std::set_intersection(
in1.begin(), in1.end(),
in2.begin(), in2.end(),
std::ostream_iterator<sorted_string>(std::cout, "\n"));
}