- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个简单的圆形 vector 类。我想实现一个 emplace 成员函数,但出现了一个我不明白的错误。对于我做错的事情,这可能是一个简单的修复,但由于我对可变参数模板没有太多经验,我无法弄清楚是什么......
我得到的错误是:
main.cpp: In function 'int main()':
main.cpp:104:50: error: no matching function for call to 'CircularVector<Item>::emplace(int, int, int, int, int, int, std::vector<int>, int)'
v.emplace(1, 0, 1, 0, 1, 0, vector<int>(), -1);
^
main.cpp:104:50: note: candidate is:
main.cpp:20:7: note: void CircularVector<T, Args>::emplace(const Args& ...) [with T = Item; Args = {}]
void emplace(const Args &... args) {
^
main.cpp:20:7: note: candidate expects 0 arguments, 8 provided
产生此错误的源代码是(也位于此处 http://coliru.stacked-crooked.com/a/37d50d6f23363357 ):
#include <vector>
using namespace std;
#define CIRCULAR_BUFFER_DEFAULT_SIZE 5000
template <typename T, typename ...Args>
class CircularVector {
public:
CircularVector(int size) {
_size = size;
_v.reserve(_size);
}
CircularVector() {
_size = CIRCULAR_BUFFER_DEFAULT_SIZE;
_v.reserve(_size);
}
void emplace(const Args &... args) {
++Count;
++_indexWrite;
if (_indexWrite > _size - 1) _indexWrite = 0;
_v.emplace(_indexWrite, args...);
}
void push(const T& item) {
++Count;
++_indexWrite;
if (_indexWrite > _size - 1) _indexWrite = 0;
_v[_indexWrite] = item;
}
void pop(T& item) {
item = _v[_indexRead];
++_indexRead;
if (_indexRead > _size - 1) _indexRead = 0;
--Count;
}
T& back() {
return _v[(_indexRead + Count - 1) % _size];
}
void erase(int numItems) {
_indexRead += numItems;
if (_indexRead > _size - 1) _indexRead -= _size;
Count -= numItems;
}
void eraseAt(int index) {
swap(_v[index], _v[(_indexRead + Count - 1) % _size]);
--Count;
--_indexWrite;
if (_indexWrite < 0) {
_indexWrite = _size - 1;
}
}
void clear() {
_indexRead = 0;
_indexWrite = -1;
Count = 0;
}
T& operator[](std::size_t idx) {
int index = _indexRead + idx;
if (index > _size) index = index % _size;
return _v[index];
};
int Count = 0;
private:
int _indexWrite = -1;
int _indexRead = 0;
int _size = 0;
std::vector<T> _v;
};
class Item {
public:
double A;
int B;
int C;
vector<int> D;
int E;
Item(double a, int b, int c, vector<int> &d, int e) {
A = a;
B = b;
C = c;
D = d;
E = e;
}
};
int main() {
CircularVector<Item> v;
v.emplace(1, 0, 1, 0, 1, 0, vector<int>(), -1);
}
最佳答案
万一有人遇到同样的问题,我是这样实现的:
void emplace(Args&&... args) {
++Count;
++_indexWrite;
if (_indexWrite > _size - 1) _indexWrite = 0;
_v.emplace(_v.begin() + _indexWrite, std::forward<Args>(args)...);
}
尽管我真正想要的是使用该索引中的保留内存构造一个元素,而不是在该特定位置插入新元素。
关于c++ - 带有可变参数模板的自定义容器 emplace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28628484/
我有一个 std::unordered_map,它的 value_type 没有默认构造函数,所以我不能执行以下操作 auto k = get_key(); auto& v = my_map[k];
我有这个代码: std::vector> vec; vec.emplace_back("a", 1); //success vec.emplace(vec.end(), "b", 2); //comp
两种放置方式: std::unordered_map m; 首先:放置移动的键和值 // 1. { std::string k1 = "key1"; std::string v1 =
我正在实现一个简单的圆形 vector 类。我想实现一个 emplace 成员函数,但出现了一个我不明白的错误。对于我做错的事情,这可能是一个简单的修复,但由于我对可变参数模板没有太多经验,我无法弄清
以下代码使用 gcc 6.3 ( https://godbolt.org/g/sVZ8OH ) 编译时没有任何错误/警告,但由于下面标记的无效内存访问,它包含危险的未定义行为。根本原因是在 empla
如果我有这张 map std::unordered_map sockets; //a map holding all active sockets 我怎么可以这样做: sockets[_myId]=
我将这个容器作为类中的一个成员: std::unordered_map m_fruits; 我想在同一个类中向它添加一个新元素,我尝试了两种方法,两种方法都应该基于示例工作。 (在 emplace 的
需要为整数和一些用户定义的类创建 unordered_map - MyClass,其中 MyClass 使用互斥锁进行数据访问同步,即 MyClass 对象不能被复制或移动。是否可以创建这样的 map
#include #include #include using namespace std; struct Time { int h; int m; int s; };
我在myclass.h 文件中有以下代码: typedef std::unordered_set Parameters; class MyClass { public: voi
我正在尝试使用 emplace()就地 build 一个map条目(使用 boost )。关键对象构造函数 arg 通过模板魔术正确转发,但是 V object constructor arg 变为
下面的代码给出了段错误,有人能赐教吗?我想要实现的是让优先级队列按 tv.t 的升序或 tv.m 的降序排序。 struct tv { int m; int c; int t;
如果我创建一个带有 explicit 的结构构造函数 struct A { int x; explicit A(int x):x(x){}; }; 然后将其用作 mapped_type
这个问题在这里已经有了答案: Why doesn't emplace_back() use uniform initialization? (1 个回答) 关闭 4 年前。 自 C++11 以来我们
我正试图提出一些论据来进行对象的就地构造。我不太明白在关联容器中使用 emplace 背后的基本原理,或者我可能只是以错误的方式使用/思考。如果有人可以共享代码片段以供使用,那就太好了。 像 map
假设我有一个 map : std::map map; map.emplace(1, 2); map.insert({3, 4}); 这两个调用会有什么区别吗? 在第一次调用中,这两个整数将按值复制到e
是std::map::emplace的点创建以某种方式在标准中指定的对象(即调用构造函数)?如果是,它是在检查此类 key 的存在之前发生的还是之后发生的? 在以下情况下很重要: struct X {
我有一组对象,我想使用 emplace 将对象添加到集合中。如果集合中不存在等效对象,则 set::emplace 创建一个对象并将其放入集合中。如果集合已经有一个等效对象,set::emplace
我有一个函数在标准无序映射容器上调用 emplace() 方法,我需要返回 emplace() 给出的准确返回值称呼。我知道它返回一个 std::pair 的迭代器(无论是新的还是旧的取决于成功的操作
我看到很多代码在工作中人们使用 emplace 和 emplace_back 和一个临时对象,像这样: struct A { A::A(int, int); }; vector v; vect
我是一名优秀的程序员,十分优秀!