我有三个数字组合的巨大数字列表,
有没有办法将这些数字作为一个单元存储在一个向量中,并对它们进行排序以便打印,以便根据第一个数字对这些组合进行排序,如果碰巧有重复,那么它们将根据第二个数字等等。
以下是输入的示例:
和预期的输出:
答案 0 :(得分:2)
你基本上需要一个两维的integeres向量,然后你可以使用自定义比较器对它进行std :: sort。
bool vector_cmp(const vector<int> &v1, const vector<int> &v2)
{
for (vector<int>::size_type i = 0; i < v1.size(); ++i) {
if (v1.at(i) < v2.at(i))
return true;
else if (v2.at(i) < v1.at(i))
return false;
}
return false;
}
vector<vector<int> > int2dVector;
// Append your internal vector in here
int2dVector << ... << ... << ...;
std::sort(int2dVector.begin(), int2dVector.end(), vector_cmp);
你也可以像这样简单地写下最后一行:
std::sort(int2dVector.begin(), int2dVector.end());
原因是operator<已经退出比较矢量。
操作&lt;,&gt;,&lt; =和&gt; =表现得好像使用算法lexicographical_compare,它使用运算符&lt;按顺序比较元素。反复地,在第一次不匹配时停止。
免责声明:它是完全未经测试且仅概念证明代码。
答案 1 :(得分:2)
定义正确比较函数的一种简单方法是使用返回负,零或正的比较函数。例如。 std::string::compare
就是其中之一。
另一种方法是使用std::lexicographic_compare
。
如,
struct Triple
{
double values[3];
};
bool operator<( Triple const& a, Triple const& b )
{
return std::lexicographic_compare(
&a.values[0], &a.values[0] + 3,
&b.values[0], &b.values[0] + 3
);
}
void foo()
{
vector<Triple> triples = ...;
sort( triples.begin(), triples.end() );
}