【问题标题】:Sorting a list of pairs C++对 C++ 对列表进行排序
【发布时间】:2018-07-01 09:08:29
【问题描述】:

我正在构建一个系统,它应该在一个对列表中,两个字符串,并将它们排序为正确的顺序。它们出现在列表中:

E,F

C,D

B,C

A,B

D,E

输出应该是 A,B,C,D,E,F

给系统一个随机字母开头,然后遍历列表并使用该字母获取正确的下一个字母。因此,如果给定 C,它指向 D,而 D 指向 E。然后它返回 C 并使用它来查找之前的字母。然后我将它添加到一个双端队列。我怀疑在第二个循环中的某个地方出了点问题,这意味着我只得到了字母之后而不是之前的内容。但是,如果我给它 E 从它开始,它会很好,并且在之前和之后得到所有东西。

void mm::sort(std::string startName)
{

std::list<std::pair<std::string, std::string>>::const_iterator iterator;

std::string base = startName;
int i = 0;

for (iterator = men.begin(); iterator != men.end(); iterator++)
{

    if ((*iterator).first == base)
    {
        output.push_back(base);
        base = (*iterator).second;

        iterator = men.begin();
        i++;
    }
}

base = output[0];

for (iterator = men.begin(); iterator != men.end(); iterator++)
{

    if ((*iterator).second == base)
    {
        output.push_front(base);
        base = (*iterator).first;

        iterator = men.begin(); 
        i++;
    }
}

}

【问题讨论】:

  • so if given C, it points to E 真的吗?不是 D?
  • 如果输出完全不依赖于配对结构,并且忽略重复,为什么不将每个字符串插入一个集合?它已经完成了您想要的两件事(排序和消除重复项)。
  • 在第一个循环的if 语句中,您有:iterator = men.begin();。现在盯着你的for 循环,特别是for 循环是如何迭代的,并继续盯着它,直到你找出你的错误。记住计算机编程的黄金法则:计算机总是完全按照你告诉它去做的事情去做,而不是你想让它做的事情。一直盯着for 循环,直到你弄清楚你到底告诉计算机做什么为止。
  • @TRV 如果你能创建 MCVE 将会非常有帮助:*.com/help/mcve

标签: c++ list sorting deque


【解决方案1】:
  1. list&lt;pair&lt;string, string&gt;&gt; 展平为list&lt;string&gt;
  2. list&lt;string&gt;进行排序
  3. 从排序列表中删除重复项。

【讨论】:

  • 我不确定这就是他想要的。我认为他希望 [(A,C);(C,B)] 表示 A
【解决方案2】:

有更简单有效的方法可以做到这一点。既然你坚持要找你程序的错误,我就给你解决了。

我假设没有循环。将此与您的排序功能进行比较,并了解我为什么要搬家

迭代器++

这是你唯一错过的主要事情。

见下文。

#include<iostream>
#include<list>
#include<utility>
#include<string>

std::list<std::pair<std::string, std::string>> men;
std::list<std::string> output;

void sort(std::string startName)
{

std::list<std::pair<std::string, std::string>>::const_iterator iterator;

std::string base = startName;

for (iterator = men.begin(); iterator != men.end(); )
{

    if ((*iterator).first == base)
    {
        output.push_back(base);
        base = (*iterator).second;
        iterator = men.begin();
    }
    else {
        iterator++;
    }
}
output.push_back(base);   // Another line you missed.(for last element)

base = output.front();

for (iterator = men.begin(); iterator != men.end(); )
{

    if ((*iterator).second == base)
    {
        output.push_front((*iterator).first);
        base = (*iterator).first;

        iterator = men.begin();
    }
    else
        iterator++;
}

}


int main() {
men.push_front(std::make_pair("Five", "Six"));
men.push_front(std::make_pair("One", "Two"));
men.push_front(std::make_pair("Four", "Five"));
men.push_front(std::make_pair("Two", "Three"));
men.push_front(std::make_pair("Three", "Four"));
sort("Three");
for (std::string s : output)
    std::cout<<s<<std::endl;
getchar();
return 0;
}

【讨论】: