- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个名为 goldbox
的自定义容器只包含算术类型,我也实现了begin
和 end
成员函数来迭代元素。
我的完整源代码:
#include <algorithm>
#include <vector>
#include <initializer_list>
#include <iostream>
#include <type_traits>
#include <ranges>
template <typename T>
concept Arithmetic = std::is_arithmetic_v<T>;
template <Arithmetic T = int>
class goldbox {
private:
template <Arithmetic Base_t>
struct Node {
Base_t data;
Node<Base_t>* prev;
Node<Base_t>* next;
};
Node<T>* head;
Node<T>* current_node;
Node<T>*& __at_node(size_t index) {
auto temp = head;
size_t count {0};
while (count < index) {
temp = temp->next;
count++;
}
current_node = temp;
return current_node;
}
Node<T>*& __get_tail() {
return __at_node(length() - 1);
}
public:
using value_type = T;
goldbox() : head{nullptr}, current_node{nullptr} {}
goldbox(std::initializer_list<T>&& list_arg) : goldbox() {
decltype(auto) list_1 = std::forward<decltype(list_arg)>(list_arg);
T temp[list_1.size()];
std::copy(list_1.begin(), list_1.end(), temp);
std::reverse(temp, temp + list_1.size());
for (const auto& elem : temp)
push_front(elem);
}
class iterator {
private:
Node<T>* node;
public:
iterator(Node<T>* arg) noexcept : node{arg} {}
iterator& operator=(Node<T>* arg) {
node = arg;
return *this;
}
iterator operator++() {
if (node)
node = node->next;
return *this;
}
iterator operator++(int) {
iterator iter = *this;
++(*this);
return iter;
}
iterator operator--() {
if (node)
node = node->prev;
return *this;
}
iterator operator--(int) {
iterator iter = *this;
--(*this);
return iter;
}
bool operator==(const iterator& other) {
return (node == other.node);
}
bool operator!=(const iterator& other) {
return (node != other.node);
}
T& operator*() {
return node->data;
}
};
iterator begin() {
return iterator{head};
}
iterator end() {
return iterator{nullptr};
}
size_t length() const {
auto temp = head;
size_t count {0};
while (temp != nullptr) {
++count;
temp = temp->next;
}
return count;
}
goldbox& push_front(T arg) {
auto new_node = new Node<T>;
new_node->data = arg;
new_node->prev = nullptr;
new_node->next = head;
if (head != nullptr)
head->prev = new_node;
head = new_node;
return *this;
}
goldbox& push_back(T arg) {
auto new_node = new Node<T>;
auto last = head;
new_node->data = arg;
new_node->next = nullptr;
if (head == nullptr){
new_node->prev = nullptr;
head = new_node;
return *this;
}
while (last->next != nullptr)
last = last->next;
last->next = new_node;
new_node->prev = last;
return *this;
}
goldbox& clear() {
auto temp = head;
Node<T>* next_temp;
while (temp != nullptr) {
next_temp = temp->next;
delete temp;
temp = next_temp;
}
head = nullptr;
return *this;
}
goldbox& pop_back() {
if (head != nullptr) {
if (length() != 1) {
delete std::move(__get_tail());
__at_node(length() - 2)->next = nullptr;
} else {
this->clear();
}
}
return *this;
}
goldbox& pop_front() {
if (head != nullptr) {
auto temp = head;
head = head->next;
delete temp;
}
return *this;
}
};
int main() {
goldbox goldbox_1 {2, 3, 5, 6, 7, 9};
goldbox goldbox_2;
for (const auto& elem : goldbox_1) {
std::cout << elem << ' ';
} std::cout << '\n';
std::transform(goldbox_1.begin(), goldbox_1.end(),
std::back_inserter(goldbox_2),
[](auto x){return 2 * x - 1; }
);
for (const auto& elem : goldbox_2) {
std::cout << elem << ' ';
} std::cout << '\n';
return 0;
}
输出:
2 3 5 6 7 9
3 5 9 11 13 17
但我想使用范围来使用它,这样我就不必创建新实例。
goldbox
在基于范围的 for 循环内:
for (const auto& elem: goldbox_1 | std::ranges::views::transform([](auto x){return 2 * x - 1;})) {
std::cout << elem << ' ';
} std::cout << '\n';
它会引发错误,因为我没有提供
operator|
.
for (const auto& elem: std::ranges::views::transform(goldbox_1, [](auto x){return x + 1;})) {
std::cout << elem << ' ';
} std::cout << '\n';
它仍然会抛出一个错误,这两个
begin
和
end
未在范围内声明。
最佳答案
TLDR
你的类(class)不满足 std::ranges::input_range
因为你的迭代器不满足 std::ranges::input_iterator
.在您的迭代器类中,您需要:
difference_type
别名 operator==
常量 value_type
别名 T& operator*() const
it will still throw an error that both begin and end were not declared in the scope.
note: the required expression 'std::ranges::__cust::begin(__t)' isinvalid
581 | ranges::begin(__t);
| ~~~~~~~~~~~~~^~~~~cc1plus: note: set '-fconcepts-diagnostics-depth=' to at least 2 for more detail
-fconcepts-diagnostics-depth=
我们可以看到根本原因:
note: no operand of the disjunction is satisfied
114 | requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
115 | || __adl_begin<_Tp>
| ^~~~~~~~~~~~~~~~~~~
__member_begin
:
note: 'std::__detail::__decay_copy(__t.begin())' does not satisfyreturn-type-requirement, because
939 | { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
| ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
note: the expression 'is_constructible_v<_Tp, _Args ...> [with _Tp =goldbox::iterator; _Args = {}]' evaluated to 'false'
139 | = destructible<_Tp> && is_constructible_v<_Tp, _Args...>;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: the required type 'std::iter_difference_t<_Iter>' is invalid,because
601 | typename iter_difference_t<_Iter>;
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
note: '++ __i' does not satisfy return-type-requirement, because
603 | { ++__i } -> same_as<_Iter&>;
| ^~~~~
difference_type
公共(public)别名并使预递增和预递减运算符返回对迭代器的引用。
note: 'std::__detail::__decay_copy(__t.end())' does not satisfyreturn-type-requirement, because
136 | { __decay_copy(__t.end()) }
| ~~~~~~~~~~~~^~~~~~~~~~~error: deduced expression type does not satisfy placeholderconstraints
136 | { __decay_copy(__t.end()) }
| ~~^~~~~~~~~~~~~~~~~~~~~~~~~
137 | -> sentinel_for<decltype(_Begin{}(std::forward<_Tp>(__t)))>;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~note: the required expression '(__t == __u)' is invalid, because
282 | { __t == __u } -> __boolean_testable;
| ~~~~^~~~~~
begin()
返回的迭代器与
end
返回的迭代器不具有可比性.向下查看诊断深度,您可以看到您的
operator==
不考虑,因为它不是 const。
note: the required type 'std::iter_value_t<_In>' is invalid, because
514 | typename iter_value_t<_In>;
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~
value_type
来解决此问题别名。
note: nested requirement 'same_as<std::iter_reference_t,std::iter_reference_t<_Tp> >' is not satisfied, because
517 | requires same_as<iter_reference_t<const _In>,
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
518 | iter_reference_t<_In>>;
| ~~~~~~~~~~~~~~~~~~~~~~
operator*
应该为
iterator
返回相同的引用类型和
const iterator
.这可以通过添加 const
operator*
来解决。 :
T& operator*();
T& operator*() const;
现在所有编译错误都已修复,并且两个版本(管道和非管道)都可以编译。请注意我已经修复了编译错误,没有检查你的语义。
关于c++ - 如何在自定义容器中支持范围适配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67343733/
我不能解决这个问题。和标题说的差不多…… 如果其他两个范围/列中有“否”,我如何获得范围或列的平均值? 换句话说,我想计算 A 列的平均值,并且我有两列询问是/否问题(B 列和 C 列)。我只希望 B
我知道 python 2to3 将所有 xrange 更改为 range 我没有发现任何问题。我的问题是关于它如何将 range(...) 更改为 list(range(...)) :它是愚蠢的,只是
我有一个 Primefaces JSF 项目,并且我的 Bean 注释有以下内容: @Named("reportTabBean") @SessionScoped public class Report
在 rails3 中,我在模型中制作了相同的范围。例如 class Common ?" , at) } end 我想将公共(public)范围拆分为 lib 中的模块。所以我试试这个。 module
我需要在另一个 View 范围 bean 中使用保存在 View 范围 bean 中的一些数据。 @ManagedBean @ViewScoped public class Attivita impl
为什么下面的代码输出4?谁能给我推荐一篇好文章来深入学习 javascript 范围。 这段代码返回4,但我不明白为什么? (function f(){ return f(); functio
我有一个与此结构类似的脚本 $(function(){ var someVariable; function doSomething(){ //here } $('#som
我刚刚开始学习 Jquery,但这些示例对我帮助不大...... 现在,以下代码发生的情况是,我有 4 个表单,我使用每个表单的链接在它们之间进行切换。但我不知道如何在第一个函数中获取变量“postO
为什么当我这样做时: function Dog(){ this.firstName = 'scrappy'; } Dog.firstName 未定义? 但是我可以这样做: Dog.firstNa
我想打印文本文件 text.txt 的选定部分,其中包含: tickme 1.1(no.3) lesson1-bases lesson2-advancedfurther para:using the
我正在编写一些 JavaScript 代码。我对这个关键字有点困惑。如何在 dataReceivedHandler 函数中访问 logger 变量? MyClass: { logger: nu
我有这个代码: Public Sub test() Dim Tgt As Range Set Tgt = Range("A1") End Sub 我想更改当前为“A1”的 Tgt 的引
我正忙于此工作,以为我会把它放在我们那里。 该数字必须是最多3个单位和最多5个小数位的数字,等等。 有效的 999.99999 99.9 9 0.99999 0 无效的 -0.1 999.123456
覆盖代码时: @Override public void open(ExecutionContext executionContext) { super.open(executio
我想使用 preg_match 来匹配数字 1 - 21。我如何使用 preg_match 来做到这一点?如果数字大于 21,我不想匹配任何东西。 example preg_match('([0-9]
根据docs range函数有四种形式: (range) 0 - 无穷大 (range end) 0 - 结束 (range start end)开始 - 结束 (range start end st
我知道有一个UISlider,但是有人已经制作了RangeSlider(用两个拇指吗?)或者知道如何扩展 uislider? 最佳答案 我认为你不能直接扩展 UISlider,你可能需要扩展 UICo
我正在尝试将范围转换为列表。 nums = [] for x in range (9000, 9004): nums.append(x) print nums 输出 [9000] [9
请注意:此问题是由于在运行我的修饰方法时使用了GraphQL解析器。这意味着this的范围为undefined。但是,该问题的基础知识对于装饰者遇到问题的任何人都是有用的。 这是我想使用的基本装饰器(
我正在尝试创建一个工具来从网页上抓取信息(是的,我有权限)。 到目前为止,我一直在使用 Node.js 结合 requests 和 Cheerio 来拉取页面,然后根据 CSS 选择器查找信息。我已经
我是一名优秀的程序员,十分优秀!