在c++中对字符串的向量进行排序
sorting vector of vector of strings in C++
我有麻烦弄清楚,如何排序字符串向量的向量,这里是测试代码。
#include <iostream>
#include <vector>
#include <boost/algorithm/string.hpp>
int main(int argc, char** argv) {
std::vector <std::vector <std::string> > data_var;
std::vector <std::string> temp;
std::string str1 = "1,hello3,temp2";
std::string str2 = "2,hello2,temp1";
std::string str3 = "3,hello1,temp3";
boost::split(temp, str1, boost::is_any_of(","));
data_var.push_back(temp);
boost::split(temp, str2, boost::is_any_of(","));
data_var.push_back(temp);
boost::split(temp, str3, boost::is_any_of(","));
data_var.push_back(temp);
// sorting code here...
}
之前好了:新的更简单的答案,知道向量是可比较的:
//sorting code here...
std::sort(data_var.begin(), data_var.end(), std::greater<std::vector<std::string>>());
如果您只想根据第二列进行排序,那么您只需要提供一个自定义比较操作符。一种方法是:
struct StringListCompare
{
bool operator()(const vector<string>& lhs, const vector<string>& rhs)
{
// what do we do if lhs or rhs don't have two elements?
if (lhs.size() < 2 || rhs.size() < 2)
{
// ?
}
else
{
return lhs[1] < rhs[1];
}
}
} StringListComparer;
int main()
{
// ...
sort(data_var.begin(), data_var.end(), StringListComparer);
}
编辑:如果你在运行时才知道你要排序的列,你可以在排序对象中编码:
class StringListCompare
{
public:
explicit StringListCompare(int column) : m_column(column) {}
bool operator()(const vector<string>& lhs, const vector<string>& rhs)
{
// what do we do if lhs or rhs don't have (m_column + 1) elements?
return lhs[m_column] < rhs[m_column];
}
private:
int m_column;
};
请注意,我们添加了一个构造函数,该构造函数接受它将要作用的列。你可以这样使用:
// We set it up so the columns are 0-based:
StringListCompare compare_column_0(0), compare_column_1(1), compare_column_2(2);
cout << "Original:n" << data_var << endl;
sort(data_var.begin(), data_var.end(), compare_column_2);
cout << "Sorted on column 2:n" << data_var << endl;
sort(data_var.begin(), data_var.end(), compare_column_1);
cout << "Sorted on column 1:n" << data_var << endl;
sort(data_var.begin(), data_var.end(), compare_column_0);
cout << "Sorted on column 0:n" << data_var << endl;
如果你不想,你甚至不需要创建本地变量:
sort(data_var.begin(), data_var.end(), StringListCompare(2));
cout << "Sorted on 2, no local sort variable:n" << data_var << endl;
[Code at ideone]
假设每个向量代表某种类型的记录,并从左到右比较内部字符串。显然,sorter()代码很容易替换。您应该在代码的某个地方添加一个sorter()函数,并将其传递给std::sort算法。
bool sorter(const std::vector<std::string>& left, const std::vector<std::string>& right)
{
//go through each column
for(int i=0; i<left.size() && i<right.size()) {
// if left is "more" return that we go higher
if( left[i] > right[i])
return true;
// if left is "less" return that we go lower
else if (left[i] < right[i])
return false;
}
// if left is longer, it goes higher
if (left.size() > right.size())
return true;
else //otherwise, left go lower
return false;
}
int main() {
std::vector <std::vector <std::string> > data_var;
//...
//sorting code here...
std::sort(data_var.begin(), data_var.end(), sorter);
//...
}
查看算法中的排序函数:
template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
点击这里查看示例+ docs
相关文章:
- 将结构向量排序为子组
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 如何在对向量排序后更改索引值?c++
- C++向量排序给出0作为输出
- 将许多向量排序在一起
- 根据一个向量对多个向量排序
- 编译错误向量排序和联合
- C++我自己的函数进行向量排序
- 将字符串的向量排序为日期"yyyymmdd"
- C++ 通过使用旧向量进行预排序来改进向量排序
- C 向量排序 .h .cpp中的单独文件
- 向量排序-c++
- 将向量排序到一个无序映射c++11中
- 向量的向量排序
- c++向量排序方法编译失败,返回预期表达式
- 如何对bitset向量排序
- 向量排序的基础上只有先
- 我如何以相同的方式对两个向量排序,而条件只使用其中一个向量
- 列表排序和结构体向量排序之间的性能差距.c++
- 如何基于第二个字符串对字符串向量的向量排序