valarray
和vector
有点像,但是它主要用来做计算,重载了很多运算符可以直接用
#include<iostream>
#include<valarray>
#include<vector>
#include<algorithm>
int main()
{
using namespace std;
vector<double> data;
double temp;
cout << "enter numbers (<=0 to quit):\n";
while (cin >> temp && temp > 0) data.push_back(temp);
sort(data.begin(), data.end()); // 排序
int size = data.size();
valarray<double> numbers(size);
int i;
for (i = 0; i < size; i++) numbers[i] = data[i];
valarray<double> sq_rts(size);
sq_rts = sqrt(numbers); // 对所有的number同时做sqrt
valarray<double> results(size);
results = numbers + 2.0 * sq_rts; // 运算符重载,对所有元素做相同运算
cout.setf(ios_base::fixed);
cout.precision(4);
for (i = 0; i < size; i++) {
cout.width(8);
cout << numbers[i] << ": ";
cout.width(8);
cout << results[i] << endl;
}
cout << "done\n";
return 0;
}
结果
enter numbers (<=0 to quit):
3.3 1.8 5.2 10 14.4 21.6 26.9 0
1.8000: 4.4833
3.3000: 6.9332
5.2000: 9.7607
10.0000: 16.3246
14.4000: 21.9895
21.6000: 30.8952
26.9000: 37.2730
done
#include<iostream>
#include<valarray>
#include<cstdlib>
const int SIZE = 12;
typedef std::valarray<int> vint;
void show(const vint& v, int cols);
int main()
{
using std::slice; // from <valarray>
using std::cout;
vint valint(SIZE);
int i;
for (i = 0; i < SIZE; ++i) valint[i] = std::rand() % 10;
cout << "原始数列: \n";
show(valint, 3);
vint vcol(valint[slice(1, 4, 3)]); // 从1开始数4个数,间隔为3(1,4,7,10)
cout << "second column: \n";
show(vcol, 1);
valint[slice(2, 4, 3)] = 10; // 将第3列的值全部置为10
cout << "set last column to 10:\n";
show(valint, 3);
cout << "set first column to sum of next two:\n";
valint[slice(0, 4, 3)] = vint(valint[slice(1, 4, 3)]) + vint(valint[slice(2, 4, 3)]);
show(valint, 3);
return 0;
}
void show(const vint& v, int cols)
{
using std::cout;
using std::endl;
int lim = v.size();
for (int i = 0; i < lim; ++i)
{
cout.width(3);
cout << v[i];
if (i % cols == cols - 1) cout << endl;
else cout << " ";
}
if (lim % cols != 0) cout << endl;
}
结果
原始数列:
1 7 4
0 9 4
8 8 2
4 5 5
second column:
7
9
8
5
set last column to 10:
1 7 10
0 9 10
8 8 10
4 5 10
set first column to sum of next two:
17 7 10
19 9 10
18 8 10
15 5 10