gpt4 book ai didi

c++ - 对 map> 中的唯一值进行排序

转载 作者:行者123 更新时间:2023-11-30 03:13:29 26 4
gpt4 key购买 nike

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

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

我正在尝试对唯一值进行排序,但到目前为止,我的方法会出现编译错误。这是我的代码。

void Tramway::print_stations(const Tramway::Tramlines &tramlines)
{

for(auto map_iter = tramlines.cbegin(); map_iter != tramlines.cend(); ++map_iter)
{
std::unique(map_iter->second.cbegin(), map_iter->second.cend());

std::sort(map_iter->second.begin(), map_iter->second.end());

for( auto vec_iter = map_iter->second.cbegin() ; vec_iter != map_iter->second.cend() ; ++vec_iter )
std::cout << *vec_iter << std::endl;
}

}

有没有办法获取唯一值并同时对它们进行排序?我尝试了 std::sort(std::unique(..,..))std::sort() 需要两个参数才能工作。

以下是我不断收到的错误

    x86_64-w64-mingw32\7.3.0\include\c++\bits\stl_algobase.h:148: error: no matching function for call to 'swap(const std::__cxx11::basic_string<char>&, const std::__cxx11::basic_string<char>&)'
swap(*__a, *__b);
~~~~^~~~~~~~~~~~

x86_64-w64-mingw32\7.3.0\include\c++\bits\stl_algo.h:975: error: passing 'const std::__cxx11::basic_string<char>' as 'this' argument discards qualifiers [-fpermissive]
*++__dest = _GLIBCXX_MOVE(*__first);
^

x86_64-w64-mingw32\7.3.0\include\c++\bits\stl_algo.h:1852: error: passing 'const std::__cxx11::basic_string<char>' as 'this' argument discards qualifiers [-fpermissive]
*__first = _GLIBCXX_MOVE(__val);
^

x86_64-w64-mingw32\7.3.0\include\c++\bits\stl_heap.h:252: error: passing 'const std::__cxx11::basic_string<char>' as 'this' argument discards qualifiers [-fpermissive]
*__result = _GLIBCXX_MOVE(*__first);
^

x86_64-w64-mingw32\7.3.0\include\c++\bits\move.h:187: error: no type named 'type' in 'struct std::enable_if<false, void>'

86_64-w64-mingw32\7.3.0\include\c++\bits\stl_heap.h:225: error: passing 'const std::__cxx11::basic_string<char>' as 'this' argument discards qualifiers [-fpermissive]
*(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild));
^

86_64-w64-mingw32\7.3.0\include\c++\bits\stl_heap.h:231: error: passing 'const std::__cxx11::basic_string<char>' as 'this' argument discards qualifiers [-fpermissive]
*(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first
^
x86_64-w64-mingw32\7.3.0\include\c++\bits\stl_algobase.h:548: error: passing 'const std::__cxx11::basic_string<char>' as 'this' argument discards qualifiers [-fpermissive]
*--__result = std::move(*--__last);
~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~

最佳答案

三个问题:

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

  2. std::sort 首先,std::unique 之后。 std::unique 仅删除相邻的等效元素。

  3. std::unique 没有更改 vector 大小的权限。它只是将结果序列放在 vector 的开头。使用 remove-erase idiom消除删除的元素。

固定代码:

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';
}
}

此外,考虑使用基于范围的 for 循环和引用来简化代码:

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'});
}
}

关于c++ - 对 map<string, vector<string>> 中的唯一值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58643126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com