恒定时间内静态二维数组上的 RMQ
RMQ on static 2D array in constant time
输入是数组(n*m 1<n,m< 1000)
。我必须在 size( a*b )
.
的每个子矩阵中找到最大元素
我试图通过在 n-a+1
上迭代 x
和在 m-j+1
上迭代 y
来做到这一点。
2D segment trees
或 quad tree
s 不够快,因为查询数量很大。
我尝试延长 sparse table
但由于 space.
[ 不足而未能成功=54=]
我已经阅读了有关 Cartesian trees
的解决方案,但需要一些代码,因为我无法理解它。
请解释一个通过预计算在 O(nm)
时间或 O(1)
时间内回答查询的解决方案。此外,输入数组是静态的。
注:虽然我试过sparse table
,但可能不正确,所以请随意post一个解决方案。
我是一名 Java
程序员,所以在 Java
或 c/c++
中实现会很棒。
此外,这不是重复的,因为我已经搜索了很多但没有找到任何合适的东西。
可能性的数量:
(来自 )
在一个size (m*n)
的矩阵中,有(n-A+1)*(m-B+1)
个不同的size (A*B)
矩阵。
因此,您的函数的可能输入总数为 sum((n-A+1)*(m-B+1))
,其中 A=1..n
和 B=1..m
。
EDIT:
This is getting so huge when m=1000.
O(m^2n^2)
is O(1000^4)
... 1 trillion ... this won't fit in my small computer's memory :)
结构:
我建议您构建一个 hashmap
,您只需使用矩阵的边界进行索引:
从 a=M(i,j)
、b=M(k,l)
构建的字符串,其中 0< i < k <(n+1)
和 0< j < l <(m+1)
- 例如你可以这样构建:
aHashMap("["+i+","+j+"].["+k+","+l+"]")
预计算:
有一个函数可以计算给定矩阵 (a[i,j],b[k,l]) 的最大值 - 比如 myMax(i,j,k,l)
。我想告诉你怎么做是没有意义的。
那就简单了(不好意思我不能轻易编译任何东西所以我现在只给出原理):
for i=1 to n-1 do
for j=1 to m-1 do
for k=i to n do
for l=j to m do
aHashMap("["+i+","+j+"].["+k+","+l+"]") = myMax(i,j,k,l)
next
next
next
next
这是O(n^4)
,但是假设它是预计算的,没有意义,它只会让你的程序在存储时越来越大aHashMap
。
很高兴知道
此类问题似乎也在 http://cs.stackexchange.com ; e.g. this or that 中得到了广泛解决...因此 OP 可能会对这个 SE 感兴趣。
这种天真的方法的实现:
使用 99 x 95
它已经提供了数百万种预计算的可能性,占用大约 3Go RAM!
$ ./p1
enter number of rows:99
enter number of cols:95
pre-computing...
hashmap ready with 22572000 entries.
matrix.h
#ifndef myMatrix_JCHO
#define myMatrix_JCHO
typedef unsigned int u_it;
class Matrix
{
public:
Matrix(u_it _n, u_it _m);
Matrix(const Matrix& matr);
Matrix& operator=(const Matrix& matr);
~Matrix();
u_it getNumRows() ;
u_it getNumCols() ;
int getC(u_it i, u_it j);
void setC(u_it i, u_it j, int v);
void printMatrix();
int maxSub(u_it a_i, u_it a_j, u_it b_k, u_it b_l);
private:
u_it n, m;
int **pC;
};
#endif
matrix.cpp
#include <iostream>
#include <string>
#include <sstream>
#include "matrix.h"
Matrix::Matrix(u_it _n, u_it _m) {
n=_n;
m=_m;
int k=0;
pC = new int*[n];
for (u_it i=0; i<n; ++i){
pC[i]=new int[m];
for(u_it j=0; j<m; ++j){
pC[i][j]=++k;
}
}
}
Matrix::~Matrix(){
for (u_it i=0; i<n; ++i){
delete [] pC[i];
}
delete [] pC;
std::cout << "matrix destroyed\n";
}
u_it Matrix::getNumRows() {
return n;
}
u_it Matrix::getNumCols() {
return m;
}
int Matrix::getC(u_it i, u_it j){
return pC[i][j];
}
void Matrix::setC(u_it i, u_it j, int v){
pC[i][j]=v;
}
void Matrix::printMatrix(){
for (u_it i=0; i<n; ++i){
std::cout << "row " <<i<<" [ ";
for(u_it j=0; j<m; ++j){
std::cout << pC[i][j] << '\t';
}
std::cout << "]\n";
}
}
// Return max of submatrix a(i,j); b(k,l)
int Matrix::maxSub(u_it a_i, u_it a_j, u_it b_k, u_it b_l) {
int res = -100000;
if (a_i<=b_k && a_j<=b_l && b_k<n && b_l<m) {
for (u_it i=a_i; i<=b_k; ++i){
for(u_it j=a_j; j<=b_l; ++j){
res= (pC[i][j]>res)? pC[i][j] : res;
}
}
} else {
std::cout << "invalid arguments: out of bounds\n";
return -100000;
}
return res;
}
main.cpp
#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <cassert>
#include "matrix.h"
std::string hashKey(u_it a_i, u_it a_j, u_it b_k, u_it b_l) {
std::stringstream ss;
ss << "max(a[" << a_i << "," << a_j << "],b[" << b_k << "," << b_l << "]";
return ss.str();
}
int main() {
u_it n_rows, n_cols;
std::cout << " enter number of rows:";
std::cin >> n_rows;
std::cout << " enter number of cols:";
std::cin >> n_cols;
std::cout << " pre-computing...\n";
std::map<std::string, int> myHMap;
Matrix * mat=new Matrix(n_rows,n_cols);
//mat->printMatrix();
// "PRE" computation
for (u_it i=0; i<n_rows; ++i) {
for (u_it j=0; j<n_cols; ++j) {
for (u_it k=i; k<n_rows; ++k) {
for (u_it l=j; l<n_cols; ++l) {
//std::cout <<"max(a["<<i<<","<<j<<"],b["<<k<<","<<l<<"]"<< mat->maxSub(i, j, k, l) <<'\n';
//std::cout << mat->hashKey(i, j, k ,l) <<" -> " << mat->maxSub(i, j, k, l) <<'\n';
myHMap[hashKey(i, j, k ,l)] = mat->maxSub(i, j, k, l);
}
}
}
}
std::cout << " hashmap ready with "<< myHMap.size() <<" entries.\n";
// call to values
u_it cw_i, cw_j, cw_k, cw_l;
cw_i=0;
std::string hKey;
while (cw_i < n_rows+1) {
std::cout << " enter i,:";
std::cin >> cw_i;
std::cout << " enter j,:";
std::cin >> cw_j;
std::cout << " enter k,:";
std::cin >> cw_k;
std::cout << " enter l:";
std::cin >> cw_l;
hKey = hashKey(cw_i, cw_j, cw_k, cw_l);
std::map<std::string, int>::iterator i = myHMap.find(hKey);
assert(i != myHMap.end());
std::cout << i->first <<" -> " << i->second <<'\n';
}
}
制作
g++ -std=c++0x -std=c++0x -Wall -c -g matrix.cpp
g++ -std=c++0x -std=c++0x -Wall -c -g main.cpp
g++ -std=c++0x -std=c++0x -Wall -g matrix.o main.o -o p1
我找到了让它在 O(mn)
中计算的答案 - 仍然有一点预计算 - 但这次最后一个很容易 O(mn.log(mn))
也很容易:它只是排序所有的列表矩阵的值。
预计算:
第一步是简单地构建矩阵值的有序结构,比如 M(A)
,然后使用 <algorithm>std::sort
对该结构进行排序。
检索任何子矩阵的最大值(a,b)
:
要获得任何矩阵的最大值,只需从预先计算的结构 M(A)
中的最大值开始,然后检查它是否在 (a,b)
.
内
- 如果是,那么你就完成了
- 否则,取
M(A)
中的下一个
matrix.h
#ifndef myMatrix_JCHO
#define myMatrix_JCHO
typedef unsigned int u_it;
typedef std::pair<u_it, u_it> uup;
class Matrix
{
public:
Matrix(u_it _n, u_it _m);
Matrix(const Matrix& matr);
Matrix& operator=(const Matrix& matr);
~Matrix();
u_it getNumRows() ;
u_it getNumCols() ;
int getC(u_it i, u_it j);
void setC(u_it i, u_it j, int v);
void printMatrix();
int maxSub(u_it a_i, u_it a_j, u_it b_k, u_it b_l);
private:
u_it n, m;
int **pC;
};
#endif
matrix.cpp
#include <iostream>
#include <string>
#include <sstream>
#include "matrix.h"
Matrix::Matrix(u_it _n, u_it _m) {
n=_n;
m=_m;
//int k=0;
pC = new int*[n];
for (u_it i=0; i<n; ++i){
pC[i]=new int[m];
for(u_it j=0; j<m; ++j){
pC[i][j]=rand()%1000;
}
}
}
Matrix::~Matrix(){
for (u_it i=0; i<n; ++i){
delete [] pC[i];
}
delete [] pC;
std::cout << "matrix destroyed\n";
}
u_it Matrix::getNumRows() {
return n;
}
u_it Matrix::getNumCols() {
return m;
}
int Matrix::getC(u_it i, u_it j){
return pC[i][j];
}
void Matrix::setC(u_it i, u_it j, int v){
pC[i][j]=v;
}
void Matrix::printMatrix(){
for (u_it i=0; i<n; ++i){
std::cout << "row " <<i<<" [ ";
for(u_it j=0; j<m; ++j){
std::cout << pC[i][j] << '\t';
}
std::cout << "]\n";
}
}
main.cpp
#include <iostream>
#include <string>
#include <utility>
#include <algorithm>
#include <vector>
#include "matrix.h"
// sort function for my vector of pair:
bool oMyV(std::pair<uup, int> x, std::pair<uup, int> y) { return (x.second > y.second); }
// check that p is within matrix formed by a and b
bool isIn_a_b(uup p, uup a, uup b){
bool res = false;
if (p.first >= a.first && p.first <= b.first) {
if (p.second >= a.second && p.second <= b.second) {
res = true;
}
}
return res;
}
int main() {
u_it n_rows, n_cols;
std::cout << " enter number of rows:";
std::cin >> n_rows;
std::cout << " enter number of cols:";
std::cin >> n_cols;
std::cout << " pre-computing...\n";
std::pair<uup, int> *ps;
std::vector<std::pair<uup, int> > myV;
Matrix * mat=new Matrix(n_rows,n_cols);
// print to debug:
mat->printMatrix();
// "PRE" computation
for (u_it i=0; i<n_rows; ++i) {
for (u_it j=0; j<n_cols; ++j) {
ps=new std::pair<uup, int>(std::make_pair(i,j), mat->getC(i,j));
myV.push_back(*ps);
}
}
std::sort(myV.begin(), myV.end(), oMyV);
/* in case you want to print ordered valuet ordered valuess for debug */
for (std::vector<std::pair<uup, int> >::iterator it=myV.begin(); it!=myV.end(); ++it) {
std::cout << it->second << " at [" << it->first.first <<','<<it->first.second<< "]\n";
}
/**/
// call to values
bool byebye=false;
uup a, b;
do {
std::cout << " enter i,:"; std::cin >> a.first;
std::cout << " enter j,:"; std::cin >> a.second;
std::cout << " enter k,:"; std::cin >> b.first;
std::cout << " enter l,:"; std::cin >> b.second;
std::vector<std::pair<uup, int> >::iterator it=myV.begin();
std::cout << " a:["<<a.first<<','<<a.second<<"]-b:["<<b.first<<','<<b.second<<"] in ";
std::cout << " M:[0,0]--:["<<n_rows-1<<','<<n_cols-1<<"]\n";
// check validity:
if ( isIn_a_b(a, std::make_pair(0,0), std::make_pair(n_rows-1, n_cols-1) )
&& isIn_a_b(b, std::make_pair(0,0), std::make_pair(n_rows-1, n_cols-1) )
&& (a.first <= b.first)
&& (a.second <= b.second)
) {
while (! isIn_a_b(it->first, a, b) && it!=myV.end()){
++it;
}
std::cout << "Found:" << it->second << " at [" << it->first.first <<','<<it->first.second<< "]\n";
} else {
std::cout << "makes no sense. bye.\n";
byebye=true;
}
} while (!byebye);
}
生成文件
(不要忘记:制表在Makefile中)
OBJS = matrix.o main.o
CC = g++ -std=c++0x
DEBUG = -g
CFLAGS = -std=c++0x -Wall -c $(DEBUG)
LFLAGS = -std=c++0x -Wall $(DEBUG)
TARFILE = ${HOME}/jcho/good/matrix.tar
p1 : $(OBJS)
$(CC) $(LFLAGS) $(OBJS) -o p1
matrix.o: matrix.cpp matrix.h
$(CC) $(CFLAGS) matrix.cpp
main.o: main.cpp matrix.h
$(CC) $(CFLAGS) main.cpp
clean:
\rm -f *.o *~ p1
tar:
tar cfv $(TARFILE) *.h *.cpp Makefile \
p1 && \
echo "tar $(TARFILE) created successfuly."
输入是数组(n*m 1<n,m< 1000)
。我必须在 size( a*b )
.
我试图通过在 n-a+1
上迭代 x
和在 m-j+1
上迭代 y
来做到这一点。
2D segment trees
或quad tree
s 不够快,因为查询数量很大。我尝试延长
[ 不足而未能成功=54=]sparse table
但由于 space.我已经阅读了有关
Cartesian trees
的解决方案,但需要一些代码,因为我无法理解它。
请解释一个通过预计算在 O(nm)
时间或 O(1)
时间内回答查询的解决方案。此外,输入数组是静态的。
注:虽然我试过sparse table
,但可能不正确,所以请随意post一个解决方案。
我是一名 Java
程序员,所以在 Java
或 c/c++
中实现会很棒。
此外,这不是重复的,因为我已经搜索了很多但没有找到任何合适的东西。
可能性的数量:
(来自
在一个size (m*n)
的矩阵中,有(n-A+1)*(m-B+1)
个不同的size (A*B)
矩阵。
因此,您的函数的可能输入总数为 sum((n-A+1)*(m-B+1))
,其中 A=1..n
和 B=1..m
。
EDIT: This is getting so huge when m=1000.
O(m^2n^2)
isO(1000^4)
... 1 trillion ... this won't fit in my small computer's memory :)
结构:
我建议您构建一个 hashmap
,您只需使用矩阵的边界进行索引:
从 a=M(i,j)
、b=M(k,l)
构建的字符串,其中 0< i < k <(n+1)
和 0< j < l <(m+1)
- 例如你可以这样构建:
aHashMap("["+i+","+j+"].["+k+","+l+"]")
预计算:
有一个函数可以计算给定矩阵 (a[i,j],b[k,l]) 的最大值 - 比如
myMax(i,j,k,l)
。我想告诉你怎么做是没有意义的。那就简单了(不好意思我不能轻易编译任何东西所以我现在只给出原理):
for i=1 to n-1 do for j=1 to m-1 do for k=i to n do for l=j to m do aHashMap("["+i+","+j+"].["+k+","+l+"]") = myMax(i,j,k,l) next next next next
这是O(n^4)
,但是假设它是预计算的,没有意义,它只会让你的程序在存储时越来越大aHashMap
。
很高兴知道
此类问题似乎也在 http://cs.stackexchange.com ; e.g. this or that 中得到了广泛解决...因此 OP 可能会对这个 SE 感兴趣。
这种天真的方法的实现:
使用 99 x 95
它已经提供了数百万种预计算的可能性,占用大约 3Go RAM!
$ ./p1
enter number of rows:99
enter number of cols:95
pre-computing...
hashmap ready with 22572000 entries.
matrix.h
#ifndef myMatrix_JCHO
#define myMatrix_JCHO
typedef unsigned int u_it;
class Matrix
{
public:
Matrix(u_it _n, u_it _m);
Matrix(const Matrix& matr);
Matrix& operator=(const Matrix& matr);
~Matrix();
u_it getNumRows() ;
u_it getNumCols() ;
int getC(u_it i, u_it j);
void setC(u_it i, u_it j, int v);
void printMatrix();
int maxSub(u_it a_i, u_it a_j, u_it b_k, u_it b_l);
private:
u_it n, m;
int **pC;
};
#endif
matrix.cpp
#include <iostream>
#include <string>
#include <sstream>
#include "matrix.h"
Matrix::Matrix(u_it _n, u_it _m) {
n=_n;
m=_m;
int k=0;
pC = new int*[n];
for (u_it i=0; i<n; ++i){
pC[i]=new int[m];
for(u_it j=0; j<m; ++j){
pC[i][j]=++k;
}
}
}
Matrix::~Matrix(){
for (u_it i=0; i<n; ++i){
delete [] pC[i];
}
delete [] pC;
std::cout << "matrix destroyed\n";
}
u_it Matrix::getNumRows() {
return n;
}
u_it Matrix::getNumCols() {
return m;
}
int Matrix::getC(u_it i, u_it j){
return pC[i][j];
}
void Matrix::setC(u_it i, u_it j, int v){
pC[i][j]=v;
}
void Matrix::printMatrix(){
for (u_it i=0; i<n; ++i){
std::cout << "row " <<i<<" [ ";
for(u_it j=0; j<m; ++j){
std::cout << pC[i][j] << '\t';
}
std::cout << "]\n";
}
}
// Return max of submatrix a(i,j); b(k,l)
int Matrix::maxSub(u_it a_i, u_it a_j, u_it b_k, u_it b_l) {
int res = -100000;
if (a_i<=b_k && a_j<=b_l && b_k<n && b_l<m) {
for (u_it i=a_i; i<=b_k; ++i){
for(u_it j=a_j; j<=b_l; ++j){
res= (pC[i][j]>res)? pC[i][j] : res;
}
}
} else {
std::cout << "invalid arguments: out of bounds\n";
return -100000;
}
return res;
}
main.cpp
#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <cassert>
#include "matrix.h"
std::string hashKey(u_it a_i, u_it a_j, u_it b_k, u_it b_l) {
std::stringstream ss;
ss << "max(a[" << a_i << "," << a_j << "],b[" << b_k << "," << b_l << "]";
return ss.str();
}
int main() {
u_it n_rows, n_cols;
std::cout << " enter number of rows:";
std::cin >> n_rows;
std::cout << " enter number of cols:";
std::cin >> n_cols;
std::cout << " pre-computing...\n";
std::map<std::string, int> myHMap;
Matrix * mat=new Matrix(n_rows,n_cols);
//mat->printMatrix();
// "PRE" computation
for (u_it i=0; i<n_rows; ++i) {
for (u_it j=0; j<n_cols; ++j) {
for (u_it k=i; k<n_rows; ++k) {
for (u_it l=j; l<n_cols; ++l) {
//std::cout <<"max(a["<<i<<","<<j<<"],b["<<k<<","<<l<<"]"<< mat->maxSub(i, j, k, l) <<'\n';
//std::cout << mat->hashKey(i, j, k ,l) <<" -> " << mat->maxSub(i, j, k, l) <<'\n';
myHMap[hashKey(i, j, k ,l)] = mat->maxSub(i, j, k, l);
}
}
}
}
std::cout << " hashmap ready with "<< myHMap.size() <<" entries.\n";
// call to values
u_it cw_i, cw_j, cw_k, cw_l;
cw_i=0;
std::string hKey;
while (cw_i < n_rows+1) {
std::cout << " enter i,:";
std::cin >> cw_i;
std::cout << " enter j,:";
std::cin >> cw_j;
std::cout << " enter k,:";
std::cin >> cw_k;
std::cout << " enter l:";
std::cin >> cw_l;
hKey = hashKey(cw_i, cw_j, cw_k, cw_l);
std::map<std::string, int>::iterator i = myHMap.find(hKey);
assert(i != myHMap.end());
std::cout << i->first <<" -> " << i->second <<'\n';
}
}
制作
g++ -std=c++0x -std=c++0x -Wall -c -g matrix.cpp
g++ -std=c++0x -std=c++0x -Wall -c -g main.cpp
g++ -std=c++0x -std=c++0x -Wall -g matrix.o main.o -o p1
我找到了让它在 O(mn)
中计算的答案 - 仍然有一点预计算 - 但这次最后一个很容易 O(mn.log(mn))
也很容易:它只是排序所有的列表矩阵的值。
预计算:
第一步是简单地构建矩阵值的有序结构,比如 M(A)
,然后使用 <algorithm>std::sort
对该结构进行排序。
检索任何子矩阵的最大值(a,b)
:
要获得任何矩阵的最大值,只需从预先计算的结构 M(A)
中的最大值开始,然后检查它是否在 (a,b)
.
- 如果是,那么你就完成了
- 否则,取
M(A)
中的下一个
matrix.h
#ifndef myMatrix_JCHO
#define myMatrix_JCHO
typedef unsigned int u_it;
typedef std::pair<u_it, u_it> uup;
class Matrix
{
public:
Matrix(u_it _n, u_it _m);
Matrix(const Matrix& matr);
Matrix& operator=(const Matrix& matr);
~Matrix();
u_it getNumRows() ;
u_it getNumCols() ;
int getC(u_it i, u_it j);
void setC(u_it i, u_it j, int v);
void printMatrix();
int maxSub(u_it a_i, u_it a_j, u_it b_k, u_it b_l);
private:
u_it n, m;
int **pC;
};
#endif
matrix.cpp
#include <iostream>
#include <string>
#include <sstream>
#include "matrix.h"
Matrix::Matrix(u_it _n, u_it _m) {
n=_n;
m=_m;
//int k=0;
pC = new int*[n];
for (u_it i=0; i<n; ++i){
pC[i]=new int[m];
for(u_it j=0; j<m; ++j){
pC[i][j]=rand()%1000;
}
}
}
Matrix::~Matrix(){
for (u_it i=0; i<n; ++i){
delete [] pC[i];
}
delete [] pC;
std::cout << "matrix destroyed\n";
}
u_it Matrix::getNumRows() {
return n;
}
u_it Matrix::getNumCols() {
return m;
}
int Matrix::getC(u_it i, u_it j){
return pC[i][j];
}
void Matrix::setC(u_it i, u_it j, int v){
pC[i][j]=v;
}
void Matrix::printMatrix(){
for (u_it i=0; i<n; ++i){
std::cout << "row " <<i<<" [ ";
for(u_it j=0; j<m; ++j){
std::cout << pC[i][j] << '\t';
}
std::cout << "]\n";
}
}
main.cpp
#include <iostream>
#include <string>
#include <utility>
#include <algorithm>
#include <vector>
#include "matrix.h"
// sort function for my vector of pair:
bool oMyV(std::pair<uup, int> x, std::pair<uup, int> y) { return (x.second > y.second); }
// check that p is within matrix formed by a and b
bool isIn_a_b(uup p, uup a, uup b){
bool res = false;
if (p.first >= a.first && p.first <= b.first) {
if (p.second >= a.second && p.second <= b.second) {
res = true;
}
}
return res;
}
int main() {
u_it n_rows, n_cols;
std::cout << " enter number of rows:";
std::cin >> n_rows;
std::cout << " enter number of cols:";
std::cin >> n_cols;
std::cout << " pre-computing...\n";
std::pair<uup, int> *ps;
std::vector<std::pair<uup, int> > myV;
Matrix * mat=new Matrix(n_rows,n_cols);
// print to debug:
mat->printMatrix();
// "PRE" computation
for (u_it i=0; i<n_rows; ++i) {
for (u_it j=0; j<n_cols; ++j) {
ps=new std::pair<uup, int>(std::make_pair(i,j), mat->getC(i,j));
myV.push_back(*ps);
}
}
std::sort(myV.begin(), myV.end(), oMyV);
/* in case you want to print ordered valuet ordered valuess for debug */
for (std::vector<std::pair<uup, int> >::iterator it=myV.begin(); it!=myV.end(); ++it) {
std::cout << it->second << " at [" << it->first.first <<','<<it->first.second<< "]\n";
}
/**/
// call to values
bool byebye=false;
uup a, b;
do {
std::cout << " enter i,:"; std::cin >> a.first;
std::cout << " enter j,:"; std::cin >> a.second;
std::cout << " enter k,:"; std::cin >> b.first;
std::cout << " enter l,:"; std::cin >> b.second;
std::vector<std::pair<uup, int> >::iterator it=myV.begin();
std::cout << " a:["<<a.first<<','<<a.second<<"]-b:["<<b.first<<','<<b.second<<"] in ";
std::cout << " M:[0,0]--:["<<n_rows-1<<','<<n_cols-1<<"]\n";
// check validity:
if ( isIn_a_b(a, std::make_pair(0,0), std::make_pair(n_rows-1, n_cols-1) )
&& isIn_a_b(b, std::make_pair(0,0), std::make_pair(n_rows-1, n_cols-1) )
&& (a.first <= b.first)
&& (a.second <= b.second)
) {
while (! isIn_a_b(it->first, a, b) && it!=myV.end()){
++it;
}
std::cout << "Found:" << it->second << " at [" << it->first.first <<','<<it->first.second<< "]\n";
} else {
std::cout << "makes no sense. bye.\n";
byebye=true;
}
} while (!byebye);
}
生成文件
(不要忘记:制表在Makefile中)
OBJS = matrix.o main.o
CC = g++ -std=c++0x
DEBUG = -g
CFLAGS = -std=c++0x -Wall -c $(DEBUG)
LFLAGS = -std=c++0x -Wall $(DEBUG)
TARFILE = ${HOME}/jcho/good/matrix.tar
p1 : $(OBJS)
$(CC) $(LFLAGS) $(OBJS) -o p1
matrix.o: matrix.cpp matrix.h
$(CC) $(CFLAGS) matrix.cpp
main.o: main.cpp matrix.h
$(CC) $(CFLAGS) main.cpp
clean:
\rm -f *.o *~ p1
tar:
tar cfv $(TARFILE) *.h *.cpp Makefile \
p1 && \
echo "tar $(TARFILE) created successfuly."