【发布时间】:2021-09-03 04:38:43
【问题描述】:
我想按降序对 m_correlationValues 进行排序并获取排序列表的 ID。我有这个错误。我会感谢你的帮助。 'operator=' 不匹配(操作数类型为 'std::vector<:pair float>>' 和 'void') 返回 idx_correlation.second; });
void MatrixCanvas::SortMatrix()
{
int naxes = (int) m_correlationData.size();
std::vector<std::pair<int,float>> idx_correlations;
std::vector<std::pair<int,float>> sorted;
std::vector<int> idxs(naxes);
for(int idx =0; idx<naxes;idx++){
idx_correlations[idx] = std::make_pair(idx, m_correlationValues[chosen_row_id][idx]);}
// Wrong
sorted = std::sort(idx_correlations.begin(),
idx_correlations.end(),
[](std::pair<int,float> &idx_correlation){
return idx_correlation.second; });
// this will contain the order:
for(int i =0; i<naxes;i++)
idxs[i] = sorted[i].first;
}
【问题讨论】:
-
您的排序谓词必须 (1) 具有不同的签名,因为它被调用时带有两个要比较的参数,并且 (2) 返回一个
bool指示是否将第一个参数视为“更少" 比第二个。 -
std::sort不返回任何内容。它排序到位。当它返回idx_correlations时将被排序。如果您想保持未排序,那么您应该先制作一个副本,例如sorted = idx_correlations,然后将迭代器传递给sorted到sort。如果您确实解决了这个问题,那么请为@lubgr 提到的排序谓词准备一个非常长的错误。 :) -
sorted = std::sort(idx_correlations.begin(),...-- 你对这段代码的意图是什么?这不是std::sort的工作方式。 -
排序对将具有以下标准:所有对在此处的第一个 (x,y) 排序 x,如果相等,则按其第二个 (x,y) 在此处的 y 排序。
-
@Cece -- 排序的类型无关紧要 -- 它们可以是简单的
int、doubles、pairs或小部件 -- 没关系.std::sort谓词采用该类型的两个参数。你有两个值,你应该返回true或false,这取决于第一个值是否应该放在第二个值之前。也许如果您使用现代 C++ 语法并使用auto,事情会更容易理解:std::sort(idx_correlations.begin(), idx.correlations.end(), [](auto& val1, auto& val2)...。auto是什么取决于向量持有的类型。