如何使用std::sort对vector<vector<string>>类型矩阵的元素排序?
用std::sort对vector<vector>矩阵排序的实现方案
当然可以做到!不过因为你用的是vector<vector<string>>这种二维容器,直接给整个矩阵套std::sort肯定不行——std::sort是用来排序一维序列的。咱们得换个思路,先把矩阵里的所有元素“摊平”成一维列表,排完序再塞回矩阵里就行,完全符合你要的结果。
具体步骤和代码示例
假设你的原始矩阵是这样的:
vector<vector<string>> mat = {{"5", "2", "1"}, {"0", "0", "2"}, {"1", "4", "3"}};
- 扁平化矩阵,收集所有元素到一维容器
先把二维矩阵里的每一行元素都塞进一个一维vector<string>里:
vector<string> flat_elements; for (const auto& row : mat) { // 把当前行的所有元素追加到一维容器末尾 flat_elements.insert(flat_elements.end(), row.begin(), row.end()); }
- 用std::sort排序一维容器
这里要注意一个细节:因为元素是string类型,默认的std::sort会按字典序排序。你的例子里都是个位数数字,字典序和数值序是一致的,所以直接用默认排序就可以:
std::sort(flat_elements.begin(), flat_elements.end());
如果你的矩阵里有多位数字(比如"10"、"2"),默认排序会把"10"排在"2"前面(因为字典序里'1' < '2'),这时候就得自定义比较规则,转成数值来比:
std::sort(flat_elements.begin(), flat_elements.end(), [](const string& a, const string& b) { // 把string转成int比较,也可以用stol/stoll适配更大的数字 return stoi(a) < stoi(b); });
- 把排序后的元素回填到原矩阵
最后把排好序的一维元素逐个放回二维矩阵的对应位置:
auto elem_it = flat_elements.begin(); for (auto& row : mat) { for (auto& elem : row) { elem = *elem_it++; } }
验证结果
这时候你遍历矩阵输出的话,就能得到你想要的:0 0 1 1 2 2 3 4 5。
额外小提示
如果不想额外占用一维容器的空间,理论上可以实现自定义迭代器来遍历整个二维矩阵的元素,直接传给std::sort,但这种方法代码复杂度高,维护起来麻烦。对于大多数场景,扁平化的方法已经足够简单高效了。
内容的提问来源于stack exchange,提问作者polcompany
相关产品推荐
相关产品推荐

