我想知道是否可以连接两个包含不同类型对象的向量,以便我可以迭代连接并调用通用接口。
像这样的东西:
std::vector<A> as;
as.resize(3);
std::vector<B> bs;
bs.resize(4);
for (const auto &v : ranges::views::concat(as, bs))
{
foo(v);
}
Run Code Online (Sandbox Code Playgroud)
您可以在这里找到完整的示例 https://godbolt.org/z/nr5hhWMxj
closed_iota和iota, 来自 range-v3 库有什么区别?
我有以下代码:
#include <range/v3/all.hpp>
#include <deque>
#include <iostream>
auto main() -> int
{
using namespace ranges;
namespace views = ranges::views;
auto v1 = std::deque<double>({ 123.080, 123.110, 123.105, 123.090, 123.095 });
auto v2 = std::deque<double>({ 123.100, 123.120, 123.115, 123.070, 123.105 });
auto vc = ranges::views::concat(v1, v2);
auto lambda = [&](auto& elem){
const auto index = &elem - &vc[0];
if (index == 0 || index + 1 > vc.size()) return false;
if ((vc[index - 1] > vc[index] && vc[index] < vc[index + 1]) …Run Code Online (Sandbox Code Playgroud) rangev3 ts中"范围"和"视图"之间的区别是什么?
在G搜索上找不到任何类似的答案.猜猜我正在努力解决每个人应该做的事情:
是这样的(在c ++中说)范围'是'a'视图,反之亦然?
它只是一个视图是只读范围吗?或者也许是范围中的"元素"(当你取消引用迭代器时得到的)是const而不是另一个?
谢谢!
我试图了解 range::views::zip 在 range-v3 中如何工作。据我所知,它是一个范围,允许通过创建不同范围中的元素元组来在一个循环中迭代多个范围。
\n\nstd::vector<int> v1 = {0, 1, 2};\nstd::vector<char> v2 = {'a', 'b', 'c'};\n\n\nauto zip = ranges::views::zip(v1,v2);\n// zip(v1,v2) = [(0,a), (1,b), (2,c)]\n\nranges::actions::sort(zip);\nstd::sort(std::begin(zip), std::end(zip));\nRun Code Online (Sandbox Code Playgroud)\n\n使用排序ranges::actions工作正常,但std::sort无法编译并给出以下错误
/usr/include/c++/9.3.0/bits/stl_algobase.h:151: error: no matching function for call to \xe2\x80\x98swap(concepts::return_t<ranges::common_pair<int&, double&>, void>, concepts::return_t<ranges::common_pair<int&, double&>, void>)\xe2\x80\x99\n 151 | swap(*__a, *__b);\n | ~~~~^~~~~~~~~~~~\nRun Code Online (Sandbox Code Playgroud)\n\n为什么会发生这种情况?
\n\n我还尝试同时删除两个容器中的元素。ranges::actions::unique无法编译并出现以下错误:
/home/jjcasmar/projects/cpfsofaplugin/src/CPFSofaPlugin/minimalExample.cpp:27: error: no match for call to \xe2\x80\x98(const ranges::actions::action_closure<ranges::actions::unique_fn>) (ranges::zip_view<ranges::ref_view<std::vector<int, std::allocator<int> > >, ranges::ref_view<std::vector<double, std::allocator<double> > > >&)\xe2\x80\x99\n 27 | …Run Code Online (Sandbox Code Playgroud) #include <range/v3/all.hpp>
#include <vector>
#include <string>
#include <deque>
using namespace std::literals;
int main()
{
auto src = std::vector{"123"s, "456"s, "789"s};
auto movable_rng = ranges::subrange(
std::make_move_iterator(src.begin()),
std::make_move_iterator(src.end()));
auto dst = ranges::to<std::deque<std::string>>(movable_rng);
for (auto e : src)
{
std::cout << e << std::endl;
}
for (auto e : dst)
{
std::cout << e << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
用 libc++ 用 clang 10 编译,输出为:
123
456
789
123
456
789
Run Code Online (Sandbox Code Playgroud)
正如我所料,结果应该是:
""
""
""
123
456
789
Run Code Online (Sandbox Code Playgroud)
为什么即使是迭代器,ranges-v3 也不移动元素 std::move_iterator?
========更新======
我的范围版本是: …
在检查两个字符串是否不区分大小写相等时,为什么这段代码
\nbool rangeV3WithTransformViews(std::string_view str1, std::string_view str2) {\n return equal(str1 | transform(tolowercase),\n str2 | transform(tolowercase));\n}\nRun Code Online (Sandbox Code Playgroud)\n比这个慢很多吗?
\nbool rangeV3WithProj(std::string_view str1, std::string_view str2) {\n return equal(str1, str2, std::equal_to{}, tolowercase, tolowercase);\n}\nRun Code Online (Sandbox Code Playgroud)\n从后面的代码中,GCC 13.2-O3设法生成与低级 C 风格解决方案相同的汇编代码:
#define to_lower_ascii(c) (((c) >= \'A\' && (c) <= \'Z\') ? (c) + 32 : (c))\n\nint cstyle(const char* str1, const char* str2) {\n while (*str1 != \'\\0\' && *str2 != \'\\0\' && to_lower_ascii(*str1) == to_lower_ascii(*str2)) {\n str1++;\n str2++;\n }\n return to_lower_ascii(*str1) …Run Code Online (Sandbox Code Playgroud)