我正在尝试通过指定要排序的列顺序对CSV文件进行排序:
例如:./csort 3,1,5<数据> SORTED_DATA
或./csort 3,4,6,2,1,5<数据......
DATA的示例行:177,27,2,42,285,220
我使用了vector split(string str)函数来存储需要排序的参数中指定的列。创建一个向量:
vector<string> columns {3, 1, 5}; // for example
不完全确定如何使用此列向量来继续排序过程;但是,我知道我可以使用sort。
sort(v.begin(), v.end(), myfunction);
答案 0 :(得分:1)
据我了解你的问题,你已经将数据解析为4个向量,每列1个向量,并且你希望能够对数据进行排序,指定要排序的列的优先级 - 即按col1排序,然后是col3,然后是col4 ......
你想做的事情并不困难,但你必须稍微退缩一下。有多种方法可以解决这个问题,但这是一个粗略的概述。根据您在问题中展示的专业水平,您可能需要在以下大纲中查看一些术语,但如果您这样做,您将有一个很好的灵活解决方案来解决您的问题。
您希望按行存储数据,因为您要对行进行排序... 4列的4个向量无法帮助您。如果行中的所有4个元素都是相同的类型,则可以对该行使用std :: vector或std :: array。如果#cols已知编译时间,则std :: array是可靠的,std :: vector用于运行时。如果类型是不均匀的,您可以使用元组或结构。无论您使用何种类型,我们都称之为RowT。
解析并存储到您的行中,创建一个RowT向量。
定义一个函数对象,它为RowT的左侧和右侧提供()运算符。它必须实现&#34;少于操作&#34;遵循您想要的优先顺序。让我们称之为CustomSorter类。
一旦你有了这个,你的最终排序将是:
CustomSorter cs(/*precedence arguments*/);
std::sort(rows.begin(), rows.end(), cs);
一切都非常简单,在一个例子中可以看到一个基本的例子here。根据我的经验,您必须处理的唯一部分是排序算法本身。
答案 1 :(得分:0)
最简单的方法是使用一个具有索引列表的类作为成员,并遍历列表以查看该项是否小于另一个。
class VecLess
{
std::vector<int> indexes;
public:
VecLess(std::vector<int> init) : indexes(init)
{
}
bool operator()(const std::vector<string> & lhs, const std::vector<string> rhs)
{
for (auto i = indexes.begin(); i != indexes.end(); ++i)
{
if (lhs[*i] < rhs[*i])
return true;
if (rhs[*i] < lhs[*i])
return false;
}
return false;
}
};