C++ 对地图中的唯一值进行排序<;字符串,向量<;字符串>&燃气轮机;

C++ 对地图中的唯一值进行排序<;字符串,向量<;字符串>&燃气轮机;,c++,dictionary,c++11,vector,C++,Dictionary,C++11,Vector,我的头文件中有一个自定义映射 class Tramway { private: using stations = std::vector <std::string>; using Tramlines = std::map <std::string, stations>; ...../ 三个问题: std::unique需要可修改的迭代器。您不应将cbegin/cend传递给他们。该函数还应采用可修改的引用 std::sort首先,std::unique之

我的头文件中有一个自定义映射

class Tramway
{
private:
    using stations = std::vector <std::string>;
    using Tramlines = std::map <std::string, stations>;
...../
三个问题:

  • std::unique
    需要可修改的迭代器。您不应将
    cbegin/cend
    传递给他们。该函数还应采用可修改的引用

  • std::sort
    首先,std::unique之后<代码>标准::唯一仅删除相邻的等效元素

  • std::unique
    无权更改向量的大小。它只是将结果序列放在向量的开头。使用以消除已删除的图元

  • 固定代码:

    void Tramway::print_stations(Tramway::Tramlines& tramlines)
    {
        for (auto map_iter = tramlines.cbegin(); map_iter != tramlines.cend(); ++map_iter)
        {
            std::sort(map_iter->second.begin(), map_iter->second.end());
            map_iter->second.erase(std::unique(map_iter->second.begin(), map_iter->second.end()), map_iter->second.end());
    
           for (auto vec_iter = map_iter->second.cbegin(); vec_iter != map_iter->second.cend(); ++vec_iter)
               std::cout << *vec_iter << '\n';
        }    
    }
    
    void电车:打印车站(电车:电车线和电车线)
    {
    对于(auto-map_iter=tramlines.cbegin();map_iter!=tramlines.cend();++map_iter)
    {
    排序(映射iter->second.begin(),映射iter->second.end());
    映射iter->second.erase(std::unique(映射iter->second.begin(),映射iter->second.end()),映射iter->second.end();
    对于(auto-vec_iter=map_iter->second.cbegin();vec_iter!=map_iter->second.cend();++vec_iter)
    
    调用std::unique()后是否应该调用erase。同样
    ,但到目前为止,我的方法给了我编译错误
    您忘记了包含编译器错误。std::unique只删除连续的重复项,而容器的尾部未确定state@Borgleader我添加了编译器错误。
    std::set
    是一个排序的、唯一的集合。数据结构是否会从
    std::vector
    为了避免一开始就需要重新排列?啊,我明白了,现在它是有意义的。我尝试了你的代码,但是“map\u iter->second.erase”给出了一个错误,“没有匹配的”成员函数可供调用erase@cyberbemon它还说了什么?错误消息应该比这个长。这是完整的错误
    tramway.cpp:78:26:错误:没有用于调用“擦除”stl_向量的匹配成员函数。h:1206:7:注意:候选函数不可行:“此”参数的类型为“const std::vector”,但方法未标记为“const stl_向量”。h:1179:7:注:候选函数不可行:需要单个参数“\uu position”,但提供了两个参数n参数(tramline)也必须是常量。
    
    void Tramway::print_stations(Tramway::Tramlines& tramlines)
    {
        for (auto map_iter = tramlines.cbegin(); map_iter != tramlines.cend(); ++map_iter)
        {
            std::sort(map_iter->second.begin(), map_iter->second.end());
            map_iter->second.erase(std::unique(map_iter->second.begin(), map_iter->second.end()), map_iter->second.end());
    
           for (auto vec_iter = map_iter->second.cbegin(); vec_iter != map_iter->second.cend(); ++vec_iter)
               std::cout << *vec_iter << '\n';
        }    
    }
    
    void Tramway::print_stations(Tramway::Tramlines& tramlines)
    {
        for (auto& tramline : tramlines) {
            auto& station = tramline.second;
            std::sort(station.begin(), station.end());
            station.erase(std::unique(station.begin(), station.end()), station.end());
    
            std::copy(station.begin(), station.end(),
                      std::ostream_iterator<stations>{std::cout, '\n'});
        }    
    }