C++ valarray模板使用问题。

2025-03-14 01:08:13
推荐回答(2个)
回答1:

您好,C++提供了两个数组模板类:vector 和valarry。这些类是由不同的小组开发的,用于不同的目的。vector模板类是一个容器类和算法系统的一部分,它支持面向容器的操作,如排序、插入、重新排列、搜索、将数据转移到其他的容器中等。而valarray类模板被设计成用于表示数值数组,支持各种数值数组操作,不是STL的一部分。例如它没有push_back()和insert()方法。

1.下面程序演示了各自的优势,它使用vector的push_back()方法和自动调整大小功能来收集数据,然后对数组进行排序后,将它们从vector对象复制到一个同样大小的valarray对象中,在执行一些数学运算。
//---- comparing vector and valarray
#include
#include
#include
#include
#include
#include
int main()
{
using namespace std;
ifstream fin("E:\\testIn.txt",ios_base::in);
ofstream fout("E:\\testOut.txt",ios_base::out);
vector data;
double temp;
fout<<"Enter numbers (<=0 to quit):\n";
while(fin>>temp && temp >0)
data.push_back(temp);
sort(data.begin(),data.end());
int size = data.size();
valarray numbers(size);
int i;
for(i = 0; i < size; i++)
numbers[i] = data[i];
valarray sq_rts(size);
sq_rts = sqrt(numbers);
valarray results(size);
results = numbers + 2.0 * sq_rts;
fout.setf(ios_base::fixed);
fout.precision(4);
for(i = 0; i < size; i++)
{
fout.width(8);
fout< fout.width(8);
fout< }
fout<<"done.\n";;
fin.close();
fout.close();
return 0;
}

2.下面程序是valarray的扩展下标版本。使用了slice类。lice类对象可用在数组索引,在这种情况下,它代表不是一个值,而是一组值。slice对象被初始化为三个整数值:起始索引、索引数和跨距。
//---- using valarray slices
#include
#include
#include
#include
using namespace std;

const int SIZE = 12;
typedef std::valarray vint;
void show(const vint & v, int cols, ofstream &fout);
int main()
{
vint valint(SIZE);
ofstream fout("E:\\testOut.txt",ios_base::out);
int i;
for(i = 0; i< SIZE; i++)
valint[i] = rand() % 10;
fout<<"Original array:\n";
show(valint,3,fout);

vint vcol(valint[slice(1,4,3)]);
fout<<"Second column:\n";
show(vcol,1,fout);

vint vrow(valint[slice(3,3,1)]);
fout<<"Second row:\n";
show(vrow,3,fout);
valint[slice(2,4,3)] = 10;
fout<<"Set last column to 10:\n";
show(valint, 3, fout);
fout<<"Set first column to sum of next two:\n";
//+ not defined for slices, so convert to valarray
valint[slice(0,4,3)] = vint(valint[slice(1,4,3)]) + vint(valint[slice(2,4,3)]);
show(valint,3,fout);
return 0;
}
void show(const vint & v, int cols, ofstream &fout)
{

int lim = v.size();
for(int i = 0 ; i < lim; i++)
{
fout.width(3);
fout<< v[i];
if(i % cols == cols - 1)
fout<<"\n";
else
fout<<" ";
}
if(lim % cols != 0)
fout<<"\n";
}

回答2:

如你所说yar 是一个数组名,那么vlaarray f(yar,3)的意思就是用yar这个数组去初始化f 这个数组并且长度为3.