- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在使用 std::begin()
和 std::end()
(来自 iterator
库)和 c- 时遇到问题样式数组参数。
void SetOrigin(const double i_point[3]) {
Vector v;
std::copy(
std::begin(i_point),
std::end(i_point),
v.begin());
this->setOrigin(v);
}
这会导致 Visual Studio 2010 出现以下错误(结束时类似):
error C2784: '_Ty *std::begin(_Ty (&)[_Size])' : could not deduce template argument for '_Ty (&)[_Size]' from 'const double []'
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(995) : see declaration of 'std::begin'
将参数更改为非常量会得到相同的结果。
试图将参数指定为
...
std::begin<const double, 3>(i_point),
std::end<const double, 3>(i_point),
...
给予:
error C2664: '_Ty *std::begin<const double,3>(_Ty (&)[3])' : cannot convert parameter 1 from 'const double []' to 'const double (&)[3]'
是不是不可能在数组参数上使用 std::begin
因为它们衰减为指针?有什么技巧可以解决这个问题,还是最好不要对数组参数使用迭代器函数?
最佳答案
是的,std::begin
和 std::end
可以使用 C 样式数组的参数。
诀窍在于传递一个 C 样式数组的参数。当您将一维数组指定为普通函数的普通参数时,其类型会默默地从“T 数组”调整为“指向 T 的指针”。当您调用该函数时,传递的不是数组(作为数组),而是指向数组第一个元素的指针。
但是,可以通过引用函数模板来传递数组:
template <class T, size_t N>
void function(T (&array)[N]) {
// function body here
}
在 this 的情况下,您传递的是一个实际的数组(尽管是通过引用)而不是一个指针,您可以使用 std::begin
和 std::end
非常好。例如:
template <class T, size_t N>
T sum(T (&array)[N]) {
return std::accumulate(std::begin(array), std::end(array), T());
}
现在传递一个数组很简单,比如:
int array[] = {1, 2, 3, 4};
auto total = sum(array);
std::begin
和 std::end
本身(或至少可以)类似于 sum
实现——数组是通过引用传递的,所以它们看起来像这样:
template <class T, size_t N>
T *begin(T (&array)[N]) {
return array;
}
template <class T, size_t N>
T *end(T (&array)[N]) {
return array + N;
}
请注意,尽管这些是最近添加到标准中的,但它们不需要任何特别棘手的模板使用,因此上面的实现应该可以在普通的旧 C++98 编译器上正常工作(如果没有记错的话,即使使用 VC++ 6 等预标准编译器)。
关于c++ - std::begin 可以使用数组参数吗?如果可以,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20059602/
我想处理 vector 中的元素一段时间。为了优化这一点,我不想在处理项目时删除它,而是在最后删除所有已处理的项目。 vector::iterator it; for(it = items.begin
我对 perl 中的 const 声明有疑问,并且无法弄清楚差异,请指出有什么不同。 下面是代码: BEGIN { *SIZE = sub() { 2 }; } *ITEM = sub() {
在右值上调用std::vector 和std::begin() 的成员函数.begin() 会导致不同的输出, 如以下测试所示: vector a{ 1, 2, 3 }; vector::iterat
我正在尝试创建自己的 vector 类。目前,我正在为我的 vector 类 Vec 添加一个删除函数。当我将 variable.begin() 传递到 erase 函数参数时,我的代码会报错,但在我
在 c++ 中迭代 vector 时,我注意到标准库中有一个 begin() 函数,还有一个 begin() 作为成员函数vector 类。如果有的话,两者之间有什么区别,应该使用哪个而不是另一个?
为什么标准将 end() 定义为末尾,而不是实际末尾? 最佳答案 最好的论据是Dijkstra himself 提出的论据。 : 您希望范围的大小是一个简单的差异end - begin; 当序列退化为
我正在尝试遍历大量记录并处理它们中的每一个。即使在处理过程中发生错误,游标也应该继续循环遍历记录,但在批处理结束时,我希望看到所有产生错误的记录的错误消息。 我有以下代码: 选择.... OP
这个问题在这里已经有了答案: error: no matching function for call to 'begin(int*&)' c++ (3 个答案) 关闭 6 年前。 我想获取数组的长
如果我有 std::vector(它是一个 std::vector 并且永远是一个 std::vector)。 使用 std::begin() 代替 std::vector::begin()(或相反)
这个问题在这里已经有了答案: Why use non-member begin and end functions in C++11? (7 个答案) 关闭 4 年前。 在这个问题(https://
我一直在尝试在网络上查找有关这些陈述之间差异的信息,在我看来它们是相同的,但我找不到对此的确认或两者之间的任何类型的比较。 这样做有什么区别: BEGIN -- Some update, in
我正在使用 Tiled Map 学习 LibGDX。我遇到了以下两种渲染方法。第一个是我通常使用的简单的。 但是,我不明白为什么我们需要第二个。我可以使用 batch.begin();在方法 2 中也
是否可以在 SpriteBatch begin 和 end 调用之间使用 ShapeRenderer 绘制形状。 我已经尝试过但没有结果,只绘制了 SpriteBatch 纹理,场景中没有任何形状。示
嗨,我正在编写一个程序,该程序从 .pem 文件导入私钥并创建一个私钥对象以供稍后使用。我遇到的问题是一些 pem 文件头以 开头 -----BEGIN PRIVATE KEY----- 而其他人则以
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
观看 Stephan T. Lavavej:核心 C++ #1,并注意到他使用的是 begin(collection) 而不是 collection.begin()。 有什么优势? 最佳答案 我想到的
Python脚本 ''' a ''' from __future__ import print_function 运行良好(即什么都不做),但是 ''' a ''' ''' b ''' from __
如何在两种风格的公钥格式之间进行转换, 一种格式是: -----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY----- 另一种格式是: -----BEGI
我是 STL c++ 的新手。我从书中复制了这个函数: string ConverToLowerCase(string s) { transform(s.begin(), s.end(),
给定代码: #include #include #include #include using namespace std; int main() { string s("ABCDE
我是一名优秀的程序员,十分优秀!