##實戰c++中的vector系列--使用sort算法對vector<unique_ptr<string>>進行排序(sort函數“應輸入 2 個參數,卻提供了 3 個)
之前博客寫了對vector使用sort算法進行的排序,之前也寫到過`vector<unique_ptr<string>>`的一些處理方法。
今天就寫一下對`vector<unique_ptr<string>>`使用sort算法進行排序。
~~~
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<memory>
bool compare_int(int &lhs, int & rhs)
{
return lhs > rhs;
}
bool compare_first_letter(const std::unique_ptr<std::string > &lhs, const std::unique_ptr<std::string > & rhs)
{
return ((*lhs) < (*rhs));
}
bool compare_unique_ptr_int( std::unique_ptr<int > &lhs, std::unique_ptr<int > & rhs)
{
return *lhs < *rhs;
}
//bool compare_by_uniqptr(const unique_ptr<int>& a,
// const unique_ptr<int>& b) {
// return *a < *b;
//}
int main()
{
//sort vector<int>
std::vector<int> int_vector;
int_vector.push_back(5);
int_vector.push_back(4);
int_vector.push_back(3);
int_vector.push_back(6);
int_vector.push_back(9);
for (int i = 0; i < int_vector.size(); i++)
{
std::cout << int_vector[i] << " ";
}
std::cout << std::endl;
sort(int_vector.begin(), int_vector.end(), compare_int);
for (int i = 0; i < int_vector.size(); i++)
{
std::cout << (int_vector[i]) << " ";
}
std::cout << std::endl;
// sort vector<unique_ptr<string>>
std::vector<std::unique_ptr<std::string>> unique_ptr_string_vector;
std::unique_ptr<std::string> unique_ptr_string(new std::string("adr"));
unique_ptr_string_vector.push_back(std::move(unique_ptr_string));
std::unique_ptr<std::string> unique_ptr_string8(new std::string("abc"));
unique_ptr_string_vector.push_back(std::move(unique_ptr_string8));
std::unique_ptr<std::string> unique_ptr_string7(new std::string("abr"));
unique_ptr_string_vector.push_back(std::move(unique_ptr_string7));
std::unique_ptr<std::string> unique_ptr_string6(new std::string("aar"));
unique_ptr_string_vector.push_back(std::move(unique_ptr_string6));
std::unique_ptr<std::string> unique_ptr_string2(new std::string("ebr"));
unique_ptr_string_vector.push_back(std::move(unique_ptr_string2));
std::unique_ptr<std::string> unique_ptr_string3(new std::string("dbr"));
unique_ptr_string_vector.push_back(std::move(unique_ptr_string3));
std::unique_ptr<std::string> unique_ptr_string4(new std::string("cbr"));
unique_ptr_string_vector.push_back(std::move(unique_ptr_string4));
std::unique_ptr<std::string> unique_ptr_string5(new std::string("bbr"));
unique_ptr_string_vector.push_back(std::move(unique_ptr_string5));
for (int i = 0; i < unique_ptr_string_vector.size(); i++)
{
std::cout << *(unique_ptr_string_vector[i]) << " ";
}
std::cout << std::endl;
sort(unique_ptr_string_vector.begin(), unique_ptr_string_vector.end(), compare_first_letter);
for (int i = 0; i < unique_ptr_string_vector.size(); i++)
{
std::cout << *(unique_ptr_string_vector[i]) << " ";
}
std::cout << std::endl;
//sort vector<unique_ptr<int>>
std::vector<std::unique_ptr<int>> v;
std::unique_ptr<int> unique_ptr_int(new int(5));
v.push_back(std::move(unique_ptr_int));
std::unique_ptr<int> unique_ptr_int1(new int(4));
v.push_back(std::move(unique_ptr_int1));
std::unique_ptr<int> unique_ptr_int2(new int(3));
v.push_back(std::move(unique_ptr_int2));
std::unique_ptr<int> unique_ptr_int3(new int(6));
v.push_back(std::move(unique_ptr_int3));
std::unique_ptr<int> unique_ptr_int4(new int(9));
v.push_back(std::move(unique_ptr_int4));
for (int i = 0; i < v.size(); i++)
{
std::cout << *v[i] << " ";
}
std::cout << std::endl;
//sort(std::make_move_iterator(v.begin()), std::make_move_iterator(v.end()), compare_unique_ptr_int);
//for (auto i = v.begin(); i != v.end(); i++)
//{
// std::cout << **i << " ";
//}
//std::cout << std::endl;
sort(v.begin(), v.end(), compare_unique_ptr_int);
for (auto i = v.begin(); i != v.end(); i++)
{
std::cout << **i << " ";
}
std::cout << std::endl;
return 0;
}
//輸出:
5 4 3 6 9
9 6 5 4 3
adr abc abr aar ebr dbr cbr bbr
aar abc abr adr bbr cbr dbr ebr
5 4 3 6 9
3 4 5 6 9
~~~
其實還很簡單的,但是對于在類中使用sort算法進行排序,需要注意一些問題。
你很能會遇到這樣的錯誤:?
sort函數出錯“應輸入 2 個參數,卻提供了 3 個。
在類中你寫了比較函數:
~~~
bool compare_unique_ptr_int( std::unique_ptr<int > &lhs, std::unique_ptr<int > & rhs)
{
return *lhs < *rhs;
}
~~~
然后在類的某個成員函數中,使用了sort方法進行排序,第三個參數使用compare_unique_ptr_int函數,這個時候就會出現上面所說的錯誤。
但是如何改進呢??
方法有兩種:
方法一:把compare_unique_ptr_int函數改為靜態方法:
~~~
static bool compare_unique_ptr_int( std::unique_ptr<int > &lhs, std::unique_ptr<int > & rhs)
{
return *lhs < *rhs;
}
sort(v.begin(), v.end(), compare_unique_ptr_int);
~~~
方法二:使用lambda表達式進行
~~~
sort(v.begin(), v.end(), [](std::unique_ptr<int > &lhs, std::unique_ptr<int > & rhs)(){return *lhs < *rhs;});
~~~
這樣就大功告成了!!!
- 前言
- 構造、operator=和assign區別
- 將迭代器轉換為索引
- copy set to vector(別混淆了reserve和resize)
- 使用vector構造二維數組
- 可怕的迭代器失效(vector重新申請內存)
- 可怕的迭代器失效之二(刪除vector中元素)
- vector<unique_ptr<>>初始化(所有權轉移)
- vector<unique_ptr<>>作為函數的參數
- vector<unique_ptr<>>賦值給vector<unique_ptr<>>
- creating vector of local structure、vector of structs initialization
- 知道emplace_back為何優于push_back嗎?
- emplace_back造成的引用失效
- vector的一些異常
- vector的遍歷(stl算法、vector迭代器(不要在循環中判斷不等于end())、operator[])
- 使用sort算法對vector進行排序(對vector<string>排序、使用穩定的排序std::stable_sort())
- vector應用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)
- 使用sort算法對vector<unique_ptr<string>>進行排序(sort函數“應輸入 2 個參數,卻提供了 3 個)
- 對vector<自定義類>使用std::find 和 std::find_if 算法