gpt4 book ai didi

c++ - 在结构数组上使用 C++ std::copy

转载 作者:行者123 更新时间:2023-11-28 01:19:06 26 4
gpt4 key购买 nike

我想使用 std::copy 将现有结构数组复制到新结构数组。常规选项适用于 '''local_copy()'''。我想知道在下面描述的这种情况下使用 std::copy 的过程 -

我尝试了代码并在编译时得到以下错误

#include <iostream>

class BigClass{
public:
struct Astruct{
double x[2], v[2];
int rank;
}one_struct;

};

void allocate(struct BigClass::Astruct& one_struct, int i)
{
one_struct.x[0] = 1.1;
one_struct.x[1] = 1.2;
one_struct.v[0] = 2.1;
one_struct.v[1] = 2.2;
one_struct.rank = i;
}

void local_copy(struct BigClass::Astruct& dest, struct BigClass::Astruct& source)
{
dest.x[0] = source.x[0];
dest.x[1] = source.x[1];
dest.v[0] = source.v[0];
dest.v[1] = source.v[1];
dest.rank = source.rank;
}

void print(struct BigClass::Astruct one_struct)
{
std::cout << one_struct.rank << " " << one_struct.x[0] << " " << one_struct.x[1] << " " << one_struct.v[0] << " " << one_struct.v[1] << "\n";
}



int main(int argc, char *argv[]) {

int size = 10;
struct BigClass::Astruct BCobj[size];
for(int i = 0; i < size; i++) allocate(BCobj[i], i);
for(int i = 0; i < size; i++) print(BCobj[i]);

struct BigClass::Astruct second_BCobj[size];
//for(int i = 0; i < size; i++) local_copy(second_BCobj[i], BCobj[i]); // this works
for(int i = 0; i < size; i++) std::copy(BCobj[i+1], BCobj[i], second_BCobj[i]); // not working

for(int i = 0; i < size; i++) print(BCobj[i]);

}

编译时错误如下-

/usr/include/c++/7/bits/stl_algobase.h:377:57: error: no type named ‘value_type’ in ‘struct std::iterator_traits<BigClass::Astruct>’
typedef typename iterator_traits<_II>::value_type _ValueTypeI;
^~~~~~~~~~~
/usr/include/c++/7/bits/stl_algobase.h:378:57: error: no type named ‘value_type’ in ‘struct std::iterator_traits<BigClass::Astruct>’
typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
^~~~~~~~~~~
/usr/include/c++/7/bits/stl_algobase.h:379:64: error: no type named ‘iterator_category’ in ‘struct std::iterator_traits<BigClass::Astruct>’
typedef typename iterator_traits<_II>::iterator_category _Category;
^~~~~~~~~
/usr/include/c++/7/bits/stl_algobase.h:383:9: error: no type named ‘value_type’ in ‘struct std::iterator_traits<BigClass::Astruct>’
const bool __simple = (__is_trivial(_ValueTypeI)
~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __is_pointer<_II>::__value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __is_pointer<_OI>::__value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __are_same<_ValueTypeI, _ValueTypeO>::__value);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/7/bits/stl_algobase.h:386:44: error: no type named ‘iterator_category’ in ‘struct std::iterator_traits<BigClass::Astruct>’
return std::__copy_move<_IsMove, __simple,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_Category>::__copy_m(__first, __last, __result);
~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~

有一些 vector 和整型数据类型的例子。谁能为这种代码结构详细说明 std::copy 的适当顺序?谢谢。

最佳答案

std::copy使用代替 for循环,而不是一个。

std::copy(BCobj, BCobj + size, second_BCobj);

本质上与

相同
for(int i = 0; i < size; ++i) {
second_BCobj[i] = BCobj[i];
}

此外,不要忘记 #include <algorithm>对于 std::copy


std::copy 参数的解释:

std::copy 将 2 个匹配 InputIterator 类型的参数作为参数OutputIteretor 类型的要求和单个参数.幸运的是,指针符合这些要求,所以我们可以直接使用它们。因为数组名称被解释为指向其第一个元素的指针,所以我们可以将其作为参数直接传递给 std::sort


Chef Gladiator 建议的更好版本:

std::copy(std::begin(BCobj), std::end(BCobj), std::begin(second_BCobj))

关于c++ - 在结构数组上使用 C++ std::copy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57410444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com