所以我需要制作一个方法,它采用我创建的两张ASCII图片并将它们并排打印,所以方法调用:
concatHz(Picture l, Picture r);
其中Picture是一个对象,它将ASCII图片作为字符串存储在字段l.result和r.result中。
如果r是
+------+
|This |
|is the|
|String|
+------+
和l是:
This
is the
String
然后结果将是:
This +------+
is the|This |
String|is the|
|String|
+------+
我已经想到了这样做的方法,但它们看起来太复杂了,可能会有一种更简单的方法。我正在考虑使用for循环遍历每个字符串行并打印第一个字符串然后打印第二个字符串,但是这会遇到索引错误的问题,如上例所示。有没有一种简单的方法可以做到这一点,我没想到?
以下是创建基础ASCII图片的方法:
Picture Picture::create(std::vector<std::string> v){
Picture c; //default constructor called without parenthesis
c.picList=v;
c.result="";
int max1=0;
for(int i=0;i<v.size();i++){
if(v.at(i).length()>max1){
max1=v.at(i).length();
}
c.rows++;
c.result+=v.at(i)+"\n";
}
c.maxLen=max1;
return c;
}
答案 0 :(得分:1)
不要将整个图片生成为单个std::string
,您需要访问构成每个std::string
的各个std::vector
值。这样,您可以运行单个循环,其中每次迭代输出填充到l
个字符的下一个l.maxLen
字符串,然后输出下一个r
字符串,然后输出换行符。两张照片都用完后结束循环。
例如:
#include <string>
#include <vector>
class Picture
{
private:
std::vector<std::string> picList;
std::size_t maxLen;
public:
Picture();
Picture(const std::vector<std::string> &v);
static Picture create(const std::vector<std::string> &v);
std::size_t getMaxRowLen() const;
std::size_t getRows() const;
std::string getRow(std::size_t index) const;
// just in case you really need it
std::string getResult() const;
};
#include <iostream>
#include <sstream>
#include <iomanip>
Picture Picture::create(const std::vector<std::string> &v)
{
return Picture(v);
}
Picture::Picture()
: maxLen(0)
{
}
Picture::Picture(const std::vector<std::string> &v)
: picList(v), maxLen(0)
{
for(std::vector<std::string>::const_iterator iter = picList.begin(); iter != picList.end(); ++iter) {
if (iter->length() > maxLen) {
maxLen = iter->length();
}
}
}
std::size_t Picture::getMaxRowLen() const
{
return maxLen;
}
std::size_t Picture::getRows() const
{
return picList.size();
}
std::string Picture::getRow(std::size_t index) const
{
std::string row;
if (index < picList.size()) {
row = picList[index];
}
std::ostringstream oss;
oss << std::setw(maxLen) << std::left << std::setfill(' ') << row;
return oss.str();
}
std::string Picture::getResult() const
{
std::ostringstream oss;
for(std::vector<std::string>::const_iterator iter = picList.begin(); iter != picList.end(); ++iter) {
oss << std::setw(maxLen) << std::left << std::setfill(' ') << *iter << "\n";
}
return oss.str();
}
void concatHz(const Picture &l, const Picture &r)
{
std::size_t rows = std::max(l.getRows(), r.getRows());
for (std::size_t i = 0; i < rows; ++i) {
std::cout << l.getRow(i) << r.getRow(i) << "\n";
}
}
答案 1 :(得分:0)
您已经使用字符串向量来表示屏幕内容。
只需将两个ASCII艺术图像存储在这样的矢量中,然后输出。
或者你也可以使用光标定位。 ncurses图书馆。