Vector Image Enlarge

• 05-20-2006
dnysveen
Vector Image Enlarge
I'm trying to get better at C++ so I have been doing some of the challenges at topcoder.

This was the problem

Given an image as a vector <string>, scale it up by factor. That is, if the original image is M x N, the scaled image should be M*factor x N*factor. Each character in the input vector <string> should be represented by factor x factor of the same character in the output (see examples).

example

{"abc",
"def",
"ghi"}

3
Returns:
{ "aaabbbccc",
"aaabbbccc",
"aaabbbccc",
"dddeeefff",
"dddeeefff",
"dddeeefff",
"ggghhhiii",
"ggghhhiii",
"ggghhhiii" }

Here is my solution but 4 loops seems too much. Can anybody show me what I could do better? Thanks

Code:

```#include <vector> #include <iostream> using namespace std; class ImageEnlarger{ public: vector <string> enlarge(vector <string> image, int factor){   string tempImage="", tempReturn="";    vector <string> returnImage;      for(int i=0;i<image.size();i++){      tempImage=image[i];      for(int j=0;j<factor;j++){       for(int k=0;k<tempImage.length();k++){            for(int z=0;z<factor;z++){                tempReturn+=tempImage[k];         }//end for       }//end for            returnImage.push_back(tempReturn);      tempReturn="";     }//end for   }//end for       return returnImage; }//end enlarge };//end class```
• 05-20-2006
veecee
Here's my take on it, although I didn't bother to make it a function or put it in a class or anything. I'm sure the scaling algorithm could be better still...and I think I miss-used the size_t type, but I'm still in the process of learning myself :p

EDIT: I decided to put it in function form like you did, so I'm replacing the old code with the new code. I'm just not sure it's a good idea to be passing and returning a vector this way...I believe I read that it's more efficient to pass/return an iterator instead.

Code:

```#include <iostream> #include <string> #include <vector> using namespace std; vector<string> Enlarge(const vector<string> &inImage, int scaleFactor) {         vector<string> outImage;         size_t inWidth = inImage[0].length();  // first string determines width of image         size_t inHeight = inImage.size();         size_t outWidth = inWidth * scaleFactor;         size_t outHeight = inHeight * scaleFactor;         double step = 1.0 / scaleFactor;         for (size_t y = 0; y != outHeight; ++y)         {                 string temp;                 size_t yIndex = static_cast<size_t>(step * y);                 for (size_t x = 0; x != outWidth; ++x)                 {                         size_t xIndex = static_cast<size_t>(step * x);                         temp += inImage[yIndex][xIndex];                 }                 outImage.push_back(temp);         }                 return outImage; } int main() {         char *data[] = {"abc", "def", "ghi"};         size_t dataSize = sizeof(data) / sizeof(char *);         vector<string> image(data, data + dataSize);         vector<string> scaledImage;         scaledImage = Enlarge(image, 3);         // Output both image and scaledImage vectors         copy(image.begin(), image.end(), ostream_iterator<string>(cout, "\n"));         cout << endl;         copy(scaledImage.begin(), scaledImage.end(), ostream_iterator<string>(cout, "\n"));         return 0; }```