std :: vector <std :: pair <int, std :: pair <Bone, std :: string>>> без сортировки по int? - PullRequest
2 голосов
/ 18 августа 2011

у меня есть std::vector<std::pair<int,std::pair<Bone,std::string> > >

Я пытаюсь отсортировать его с помощью std sort, ожидая, что он отсортирован по int, но вместо этого я получаю 21 ошибку, связанную с вызовом sort.

Что может быть не так?

Код:

std::vector<std::pair<int,std::pair<Bone,std::string> > > tempBones;
std::sort(tempBones.begin(),tempBones.end());

Ошибка:

Ошибка 1, ошибка C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)': не удалось вывести аргумент шаблона для 'const std::basic_string<_Elem,_Traits,_Alloc> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 2, ошибка C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)': не удалось вывести аргумент шаблона для 'const _Elem *' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 3: ошибка C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)': не удалось вывести аргумент шаблона для 'const std::basic_string<_Elem,_Traits,_Alloc> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 4, ошибка C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)': не удалось вывести аргумент шаблона для 'const std::_Tree<_Traits> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 5, ошибка C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)': не удалось вывести аргумент шаблона для 'const std::vector<_Ty,_Alloc> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 6, ошибка C2784: 'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)': не удалось вывести аргумент шаблона для 'const std::list<_Ty,_Ax> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 7, ошибка C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)': не удалось вывести аргумент шаблона для 'const std::reverse_iterator<_RanIt> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 8, ошибка C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)': не удалось вывести аргумент шаблона для 'const std::_Revranit<_RanIt,_Base> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 9: ошибка C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)': не удалось вывести аргумент шаблона для 'const std::pair<_Ty1,_Ty2> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102

Ошибка 10 Ошибка C2676: двоичный файл '<': 'const skl::Bone' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 10

Ошибка 11 ошибка C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)': не удалось вывести аргумент шаблона для 'const std::basic_string<_Elem,_Traits,_Alloc> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 12, ошибка C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)': не удалось вывести аргумент шаблона для 'const _Elem *' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 13, ошибка C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)': не удалось вывести аргумент шаблона для 'const std::basic_string<_Elem,_Traits,_Alloc> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 14: ошибка C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)': не удалось вывести аргумент шаблона для 'const std::_Tree<_Traits> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 15: ошибка C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)': не удалось вывести аргумент шаблона для 'const std::vector<_Ty,_Alloc> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 16, ошибка C2784: 'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)': не удалось вывести аргумент шаблона для 'const std::list<_Ty,_Ax> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 17, ошибка C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)': не удалось вывести аргумент шаблона для 'const std::reverse_iterator<_RanIt> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 18, ошибка C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)': не удалось вывести аргумент шаблона для 'const std::_Revranit<_RanIt,_Base> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 19, ошибка C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)': не удалось вывести аргумент шаблона для 'const std::pair<_Ty1,_Ty2> &' из 'const skl::Bone' c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ошибка 20, ошибка C2676: двоичный файл '<': 'const skl::Bone' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора c: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103

Ответы [ 2 ]

11 голосов
/ 18 августа 2011

Почему вы ожидаете, что он будет отсортирован по int? Любой container<T> сортируется по T, и для сортировки требуется, чтобы для T было меньше сравнения. Теперь для pair<S,T> есть operator<, определяемый как лексикографическое упорядочение, но для этого требуется сопоставимость S и T:

// lexicographic compare:
bool operator<(pair<S,T> a, pair<S,T> b)
{
  return a.first < b. first || (!(b.first < a.first) && (a.second < b.second));
  //                                                    ^^^^^^^^^^^^^^^^^^^^^^^
} //                                                     compare second type!

При рекурсивном движении вниз вам нужно, чтобы Bone был менее сопоставим. Проверяйте, любая ставка, в которой вы не реализовали оператор сравнения для этого типа!

Редактировать: Согласно вашему обновлению, это именно ваша проблема.

Примечание: Вы можете задаться вопросом, почему лексикографическое сравнение используется по умолчанию: это единственное разумное сравнение, для которого !(x < y) && !(y < x) идентично x == y, при условии, что то же самое верно для обоих подтипов отдельно. 1023 *

Обновление: Если вы хотите упорядочивать только по первому члену, вы должны написать собственный предикат компаратора или использовать вместо него мультикарту.

Пользовательский компаратор:

template <typename S, typename T>
bool PairCompareOnlyFirst(const std::pair<S,T> & a, const std::pair<S,T> & b)
{
  return a.first < b.first;
}

std::sort(v.begin(), v.end(), PairCompareOnlyFirst);

Обратите внимание, что sort может переставлять элементы одним и тем же ключом. Если вы хотите, чтобы те сохранили свой относительный порядок, используйте stable_sort.

Multimap:

typedef std::multimap<int, std::pair<Bone,std::string> > myMapType;

Мультикарта является более сложной структурой, чем вектор, и ее элементы всегда хранятся в отсортированном порядке по значению ключа, т. Е. Вашему int. Какой из них предпочтительнее, зависит от того, что вы делаете.

1 голос
/ 18 августа 2011

Не видя ошибки, я не могу быть в этом уверен, но следует отметить, что std :: pair не просто сортирует по первому значению;он также использует второе значение, если необходимо разорвать связи.В контексте std :: map это не проблема, потому что внутренне карта использует собственный компаратор вместо оператора по умолчанию <, но если вы сортируете пары естественным образом, порядок может учитывать второй элемент. </p>

Из-за этого, если вы не определили operator <для Bone, вы получите ошибку компилятора, потому что код шаблона для оператора пары <попытается использовать его.Вдобавок ко всему, вы получите некоторые свирепые ошибки компилятора, так как компилятор сообщит об ошибке только после создания шаблонов для сортировки и пар.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...