排序 std::reference_wrapper 数组的问题,引用向量
Problems sorting an array of std::reference_wrapper, referencing vectors
我对此有点困惑,我正在使用 std::array 将引用包装器存储到向量。我试图使用 std::sort 按向量的大小对它们进行排序,但由于我不太确定的原因我无法做到,即使在阅读了编译器错误之后也是如此。我是否必须使用另一个排序函数,因为看起来 std::sort 实现使用了无法在引用包装器上使用的操作。
谢谢:)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <array>
#include <string>
#include <sstream>
#include <utility>
void findSum(const std::vector<int>& vec1, const std::vector<int>& vec2, const std::vector<int>& vec3)
{
std::array<std::reference_wrapper<const std::vector<int>>, 3> vecRefs{vec1, vec2, vec3};
std::sort(std::cbegin(vecRefs), std::cend(vecRefs), [](const auto vecA, const auto vecB) -> bool {
return vecA.get().size() > vecB.get().size(); //descending order
});
//vecRefs should now be storing reference wrappers to the vectors with sizes in descending order
//print longest vec first, shortest vec last
for (const auto vec : vecRefs)
{
for (const auto val : vec.get())
{
std::cout << val << ' ';
}
std::cout << '\n';
}
//TODO: rest of function(the bit before this can be made into a function)
}
这是因为您在 std::sort
中使用了 std::cbegin
(const begin) 和 std::cend
(const end)。
这意味着,您无法更改你数组的顺序!
只需将其替换为 std::begin
和 std::end
,如下所示:
std::sort(std::begin(vecRefs), std::end(vecRefs), [](const auto vecA, const auto vecB) -> bool {
return vecA.get().size() > vecB.get().size();
});
我对此有点困惑,我正在使用 std::array 将引用包装器存储到向量。我试图使用 std::sort 按向量的大小对它们进行排序,但由于我不太确定的原因我无法做到,即使在阅读了编译器错误之后也是如此。我是否必须使用另一个排序函数,因为看起来 std::sort 实现使用了无法在引用包装器上使用的操作。
谢谢:)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <array>
#include <string>
#include <sstream>
#include <utility>
void findSum(const std::vector<int>& vec1, const std::vector<int>& vec2, const std::vector<int>& vec3)
{
std::array<std::reference_wrapper<const std::vector<int>>, 3> vecRefs{vec1, vec2, vec3};
std::sort(std::cbegin(vecRefs), std::cend(vecRefs), [](const auto vecA, const auto vecB) -> bool {
return vecA.get().size() > vecB.get().size(); //descending order
});
//vecRefs should now be storing reference wrappers to the vectors with sizes in descending order
//print longest vec first, shortest vec last
for (const auto vec : vecRefs)
{
for (const auto val : vec.get())
{
std::cout << val << ' ';
}
std::cout << '\n';
}
//TODO: rest of function(the bit before this can be made into a function)
}
这是因为您在 std::sort
中使用了 std::cbegin
(const begin) 和 std::cend
(const end)。
这意味着,您无法更改你数组的顺序!
只需将其替换为 std::begin
和 std::end
,如下所示:
std::sort(std::begin(vecRefs), std::end(vecRefs), [](const auto vecA, const auto vecB) -> bool {
return vecA.get().size() > vecB.get().size();
});