2013-03-03 31 views
2

我想排序一个向量的字符串矢量,但我不明白如何创建一个比较函数。C++用比较器对字符串矢量的矢量进行排序。请帮我理解

我看到这个线程,但不能落实到我的情况: sorting vector of vector of strings in C++

,所以我有一个字符串看起来像这样的矢量的矢量:
你好,世界,1,3,4,7,2 ,1个
世界,你好,1,4,8,4,2,1个
电话,鼠标,2,3,5,2,1,4-

我需要通过排序矢量串的这种载体我的用户指定的列。我的用户可以指定多个列进行排序。假设第3列和第5列。列3(1,1,2)对于第1行和第2列具有相同的值,那么我们必须按第5列排序。为了不使事情复杂化,这全部按升序排列。

我不明白当它传递给比较函数时它是如何工作的概念。我的函数如何在这些线程中的人员发布的示例中循环?

无论如何,先谢谢了!

+2

http://stackoverflow.com/questions/15183953/sorting-a-vector-multiple-times(今天同样的问题由其他用户提供) – 2013-03-03 12:48:03

+0

我知道这个lhs和rhs的东西,但我不知道如何初始化lhs和rhs的矢量 。它应该是什么?我有我所有的矢量字符串矢量> allInputs ;. – user1375155 2013-03-03 13:05:04

回答

3

可以只使用std::sort排序的矢量,并限定自定义比较算符(即与重载operator()类)。

您可以将排序列的索引存储在std::vector(这将成为自定义比较对象的“状态”的一部分)中,并比较索引存储在该向量中的列的字符串。

您可以在“排序列”向量的第一个索引中指定的列处开始比较值;如果它们相同,则继续比较向量中下一个索引中指定的列处的值,这可以在比较器operator()过载体内的for循环内完成。

请看下面的代码作为一个例子(使用g ++编译(GCC)4.7.2):

#include <algorithm> 
#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

vector<vector<string>> BuildTestData() 
{ 
    vector<string> r1 = {"hello", "world", "1", "3", "4", "7", "2", "1"}; 
    vector<string> r2 = {"world", "hello", "1", "4", "8", "4", "2", "1"}; 
    vector<string> r3 = {"phone", "mouse", "2", "3", "5", "2", "1", "4"}; 

    return vector<vector<string>>{r1, r2, r3}; 
} 

void PrintData(const vector<vector<string>> & v) 
{ 
    for (size_t r = 0; r < v.size(); r++) 
    { 
     for (size_t c = 0; c < v[r].size(); c++) 
      cout << v[r][c] << ' '; 
     cout << '\n'; 
    } 
} 

class StringListComparator 
{ 
public: 
    explicit StringListComparator(vector<int> sortColumns) 
     : m_sortColumns(move(sortColumns)) 
    { 
    } 

    bool operator()(const vector<string>& lhs, const vector<string>& rhs) const 
    { 
     // For each sorting column: 
     for (size_t i = 0; i < m_sortColumns.size(); i++) 
     { 
      // Comparison with current column 
      const int currentColumn = m_sortColumns[i]; 

      if (lhs[currentColumn] < rhs[currentColumn]) 
       return true; 

      if (lhs[currentColumn] > rhs[currentColumn]) 
       return false; 

      // lhs[currentColumn] == rhs[currentColumn], 
      // so check with next sorting column 
     } 

     return false; 
    } 

private: 
    vector<int> m_sortColumns; 
}; 

int main() 
{ 
    auto v = BuildTestData(); 
    cout << "Before sorting:\n";  
    PrintData(v); 

    vector<int> sortColumns = {5, 7}; // indexes are 0-based 

    sort(v.begin(), v.end(), StringListComparator(sortColumns)); 

    cout << "\nAfter sort:\n"; 
    PrintData(v); 
} 

样品运行:

Before sorting: 
hello world 1 3 4 7 2 1 
world hello 1 4 8 4 2 1 
phone mouse 2 3 5 2 1 4 

After sort: 
phone mouse 2 3 5 2 1 4 
world hello 1 4 8 4 2 1 
hello world 1 3 4 7 2 1 
+0

非常感谢。我现在明白了。谢谢!! – user1375155 2013-03-04 04:29:07

+0

@ user1375155:做一个好的StackOverflow公民:如果你发现这篇文章(以及其他人写的其他文章)有用,请对它们进行投票并标记出最好的答案。 – 2013-03-04 08:27:28