读取每行的四个值。忽略不需要的值并将剩余值放入向量中。
std::vector<unsigned int> vector_column_2;
std::vector< std::pair<unsigned int, unsigned int> > vector_pair_column_2;
unsigned int column1, column2, column3, column 4;
char comma1, comma2;
//...
while (data_file >> column1 >> comma1 >> column2 >> column3 >> comma2 >> column4)
{
vector_column_2.push_back(column_2);
std::pair<unsigned int, unsigned int> col2_pair;
col2_pair.first = column3;
col2_pair.second = column4;
vector_pair_column_2.push_back(col2_pair);
}
编辑1:代码片段分析
代码:
for (int i=0; i<=2*n; ++i)
{
if ((i==0) || (i==2*n))
sum0=column[a+i*h];
if (i%2==1)
sum1=column[a+i*h];
if ((i%2==0) && (i!=2*n))
sum2=column[a+i*h];
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
语句: if ((i==0) || (i==2*n)) sum0=column[a+i*h]; 可以部分分解,因为条件(i == 0)
是初始化,所以循环看起来像:
sum0 = column[a]; // remember i==0, so i*h cancels out.
for (int i=0; i<=2*n; ++i)
{
if (i==2*n)
sum0=column[a+i*h];
if (i%2==1)
sum1=column[a+i*h];
if ((i%2==0) && (i!=2*n))
sum2=column[a+i*h];
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
该值2*n
是一个常数,所以创建一个。
索引表达式a + i * h
在循环中是常量,所以创建一个常量。
const unsigned int LIMIT = 2 * n; // or n << 1
sum0 = column[a]; // remember i==0, so i*h cancels out.
for (int i=0; i<=LIMIT; ++i)
{
const unsigned int row = a + i * h;
if (i==LIMIT)
sum0=column[row];
if (i%2==1)
sum1=column[row];
if ((i%2==0) && (i!=LIMIT))
sum2=column[row];
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
at 的值column[row]
被访问了 3 次,所以通过使用另一个变量来减少它。
const unsigned int LIMIT = 2 * n; // or n << 1
sum0 = column[a]; // remember i==0, so i*h cancels out.
for (int i=0; i<=LIMIT; ++i)
{
const unsigned int row = a + i * h;
const double value = column[row];
if (i==LIMIT)
sum0=value;
if (i%2==1)
sum1=value;
if ((i%2==0) && (i!=LIMIT))
sum2=value;
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
你真的想要“<=”作为终止条件吗?
许多 for 循环是i = 0 ; i < LIMIT; ++i
,注意<
not的使用<=
。