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;icout很难准确地确定您想要做什么,但是如果您有两个已排序的向量,并且您想知道两者中的匹配项,那么您可以使用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"));
}