2015-07-21 63 views
3

我在教自己C++,因此命名和超級簡單的問題非常糟糕。我試圖在C++中連接兩個數組。該數組是字符串類型。他們的構造允許他們有一個默認的容量爲12. 所以基本上我試圖結合數組,以便我有一個數組能夠保存24個元素。我不想使用矢量,我不想使用STL。陣列有一些項目,但他們沒有完全填滿他們的能力。下面你會找到代碼。連接兩個字符串數組而不使用STL或C++中的向量

這裏是我的ArrayBag.h類DEF:

#ifndef _ARRAY_BAG 
#define _ARRAY_BAG 
#include "BagInterface.h" 
#include <vector> 


template<class ItemType> 
class ArrayBag : public BagInterface<ItemType> 
{ 
private: 
    static const int DEFAULT_CAPACITY = 24; // the bag size a bit bigger to allow 
              // adding bags. 
    ItemType items[DEFAULT_CAPACITY];  // Array of bag items 
    int itemCount;       // Current count of bag items 
    int maxItems;       // Max capacity of the bag 

    // Returns either the index of the element in the array items that 
    // contains the given target or -1, if the array does not contain 
    // the target. 
    int getIndexOf(const ItemType& target) const; 

public: 
    ArrayBag(); 
    int getCurrentSize() const; 
    bool isEmpty() const; 
    bool add(const ItemType& newEntry); 
    void clear(); 
    bool remove(const ItemType& anEntry); 
    bool contains(const ItemType& target) const; 
    int getFrequencyOf(const ItemType& anEntry) const; 
    std::vector<ItemType> toVector() const; 
}; // end ArrayBag 

#endif 

這是我的實際類實現。

#include "ArrayBag.h" 
#include <cstddef> 

template<class ItemType> 
ArrayBag<ItemType>::ArrayBag(): itemCount(0), maxItems(DEFAULT_CAPACITY) 
{ 
} // end default constructor 

template<class ItemType> 
int ArrayBag<ItemType>::getCurrentSize() const 
{ 
    return itemCount; 
} // end getCurrentSize 

template<class ItemType> 
bool ArrayBag<ItemType>::isEmpty() const 
{ 
    return itemCount == 0; 
} // end isEmpty 

template<class ItemType> 
bool ArrayBag<ItemType>::add(const ItemType& newEntry) 
{ 
    bool hasRoomToAdd = (itemCount < maxItems); 
    if (hasRoomToAdd) 
    { 
     items[itemCount] = newEntry; 
     itemCount++; 
    } // end if 

    return hasRoomToAdd; 
} // end add 

template<class ItemType> 
void ArrayBag<ItemType>::clear() 
{ 
    itemCount = 0; 
} // end clear 

template<class ItemType> 
bool ArrayBag<ItemType>::remove(const ItemType& anEntry) 
{ 
    int locatedIndex = getIndexOf(anEntry); 
    bool canRemoveItem = !isEmpty() && (locatedIndex > -1); 
    if (canRemoveItem) 
    { 
     itemCount--; 
     items[locatedIndex]=items[itemCount]; 
    }//end if 
    return canRemoveItem; 
} //end remove 

template<class ItemType> 
bool ArrayBag<ItemType>::contains(const ItemType& anEntry) const 
{ 
    bool found = false; 
    int curIndex = 0; //current array index 
    while(!found && (curIndex < itemCount)) 
    { 
     if(anEntry == items[curIndex]) 
     { 
      found = true; 
     } //end if 

     curIndex++; //increment to the next entry 
    } //end while 
    return found; 
} 

template<class ItemType> 
int ArrayBag<ItemType>::getFrequencyOf(const ItemType& anEntry) const 
{ 
    int frequency = 0; 
    int curIndex = 0; //current index array 
    while(curIndex < itemCount) 
    { 
     if (items[curIndex] == anEntry) 
     { 
      frequency++; 
     } //end if 

     curIndex++; //incremenet to next entry 
    } //end while 
    return frequency; 
} //end getFrequencyOf 


template<class ItemType> 
vector<ItemType> ArrayBag<ItemType>::toVector() const 
{ 
    vector<ItemType> bagContents; 
    for (int i = 0; i < itemCount; i++) 
     bagContents.push_back(items[i]); 

    return bagContents; 
} // end toVector 

ArrayBag<string> merge(const ArrayBag<string>& oneBag, 
         const ArrayBag<string>& anotherBag) 
{ 
    int sizeOnebag, sizeAnotherbag, newBagsize; 
     sizeOnebag = oneBag.getCurrentSize(); 
     sizeAnotherbag = anotherBag.getCurrentSize(); 
     newBagsize = sizeAnotherbag + sizeOnebag; 

在上面,我已經採取了兩個袋的大小,並創建了一個新的int,它保存了兩個原始數組的大小。但從那裏我不知道該怎麼做。我已經嘗試了下面。但是每次都得到一個編譯器警告。

ArrayBag<string> finalBag; 

    int itemCount = finalBag.getCurrentSize(); 

    if (itemCount > newBagsize){ 
     newBagsize++; 
     itemCount = finalBag.getCurrentSize(); 
     finalBag[itemCount]; 
    } 

下面是BagInterface.h

#ifndef _BAG_INTERFACE 
#define _BAG_INTERFACE 

#include <vector> 
using namespace std; 

template<class ItemType> 
class BagInterface 
{ 
public: 
    /** Gets the current number of entries in this bag. 
    @return The integer number of entries currently in the bag. */ 
    virtual int getCurrentSize() const = 0; 

    /** Sees whether this bag is empty. 
    @return True if the bag is empty, or false if not. */ 
    virtual bool isEmpty() const = 0; 

    /** Adds a new entry to this bag. 
    @post If successful, newEntry is stored in the bag and 
    the count of items in the bag has increased by 1. 
    @param newEntry The object to be added as a new entry. 
    @return True if addition was successful, or false if not. */ 
    virtual bool add(const ItemType& newEntry) = 0; 

    /** Removes one occurrence of a given entry from this bag, 
    if possible. 
    @post If successful, anEntry has been removed from the bag 
    and the count of items in the bag has decreased by 1. 
    @param anEntry The entry to be removed. 
    @return True if removal was successful, or false if not. */ 
    // virtual bool remove(const ItemType& anEntry) = 0; 

    /** Removes all entries from this bag. 
    @post Bag contains no items, and the count of items is 0. */ 
    virtual void clear() = 0; 

    // I commented this out because I did not implement it. 
    /** Counts the number of times a given entry appears in bag. 
    @param anEntry The entry to be counted. 
    @return The number of times anEntry appears in the bag. */ 

    virtual int getFrequencyOf(const ItemType& anEntry) const = 0; 

    // I commented this out because I did not implement it. 

    /** Tests whether this bag contains a given entry. 
    @param anEntry The entry to locate. 
    @return True if bag contains anEntry, or false otherwise. */ 


    virtual bool contains(const ItemType& anEntry) const = 0; 

    /** Empties and then fills a given vector with all entries that 
    are in this bag. 
    @return A vector containing all the entries in the bag. */ 
    virtual vector<ItemType> toVector() const = 0; 

    virtual bool remove(const ItemType& anEntry) = 0; 
}; // end BagInterface 
#endif 

這裏是我的主要文件。

#include <iostream> 
#include <string> 
#include "ArrayBag.h" 

using namespace std; 

void displayBag(ArrayBag<string>& bag) 
{ 
    cout << "The bag contains " << bag.getCurrentSize() 
    << " items:" << endl; 
    vector<string> bagItems = bag.toVector(); 
    int numberOfEntries = (int)bagItems.size(); 
    for (int i = 0; i < numberOfEntries; i++) 
    { 
     cout << bagItems[i] << " "; 
    } // end for 
    cout << endl << endl; 
} // end displayBag 

void displayBag(ArrayBag<int>& bag) 
{ 
    cout << "The bag contains " << bag.getCurrentSize() 
    << " items:" << endl; 
    vector<int> bagItems = bag.toVector(); 
    int numberOfEntries = (int)bagItems.size(); 
    for (int i = 0; i < numberOfEntries; i++) 
    { 
     cout << bagItems[i] << " "; 
    } // end for 
    cout << endl << endl; 
} // end displayBag 

int sumOfBag(ArrayBag<int>& aBag) 
{ 
    int sum=0; 
    vector<int> aBagvector = aBag.toVector(); 
    int numberOfEntries = (int) aBagvector.size(); 
    for (int i = 0; i < numberOfEntries; i++) 
    { 
     sum += aBagvector[i]; 
    } 
    //cout << "The sum of the bag is " << sum << endl; 
    return sum; 
} 

void bagTester(ArrayBag<string>& bag) 
{ 
    cout << "isEmpty: returns " << bag.isEmpty() 
    << "; should be 1 (true)" << endl; 
    displayBag(bag); 

    string items[] = {"one", "two", "three", "four", "five", "one"}; 
    cout << "Add 6 items to the bag: " << endl; 
    for (int i = 0; i < 6; i++) 
    { 
     bag.add(items[i]); 
    } // end for 

    displayBag(bag); 

    cout << "isEmpty: returns " << bag.isEmpty() 
    << "; should be 0 (false)" << endl; 

    cout << "getCurrentSize: returns " << bag.getCurrentSize() 
    << "; should be 6" << endl; 

    cout << "Try to add another entry: add(\"extra\") returns " 
    << bag.add("extra") << endl; 
    displayBag(bag); 
} // end bagTester 


int main() 
{ 
    ArrayBag<string> bag; 
    cout << "Testing the Array-Based Bag:" << endl; 
    cout << "The initial bag is empty." << endl; 
    bagTester(bag); 
    ArrayBag<string> bag_of_strings1; 
    string items[] = {"tom","dick","harry"}; 
    for (int i=0; i<3; i++) {bag_of_strings1.add(items[i]);} 
    displayBag(bag_of_strings1); 
    ArrayBag<string> bag_of_strings2; 
    string new_items[] = {"now","is","the","time","for","all"}; 
    for(int i=0; i<6; i++){ 
     bag_of_strings2.add(new_items[i]); 
    } 
    displayBag(bag_of_strings2); 
    //ArrayBag<string> newbag=merge(bag_of_strings1,bag_of_strings2); 

    //displayBag(newbag); 

    ArrayBag<int> bag_of_ints; 
    int array_of_ints[]={6,7,85,9,12,15}; 
    for (int i=0;i<6;i++){ 
     bag_of_ints.add(array_of_ints[i]); 
    } 
    displayBag(bag_of_ints); 
    cout<<sumOfBag(bag_of_ints)<<endl; 

    return 0; 
} // end main 
+0

好吧你讓我在那裏。 – KFDoom

+0

你會得到什麼警告,爲什麼會出現這個問題? – twsaef

+0

我得到的警告是我沒有爲ArrayBag提供下標操作但是我不認爲重載我的操作員是這裏的解決方案。我確定有一個更簡單的解決方案。 – KFDoom

回答

2

你可以聲明merge爲好友:

public: 
friend ArrayBag<string> merge(ArrayBag<string> a, ArrayBag<string> b); 
ArrayBag(); 
int getCurrentSize() const; 
bool isEmpty() const; 
... 

然後定義合併,如:

ArrayBag<string> merge(ArrayList<string> a, ArrayList<string> b) { 
    int newsz = a.getCurrentSize() + b.getCurrentSize(); 
    if (newsz > a.DEFAULT_CAPACITY) 
     // do something here 
     abort(); 
    ArrayBag<string> result; 
    for (int c=0; c<a.getCurrentSize(); ++c) 
     result.add(a.items[c]); 
    for (int c=0; c<b.getCurrentSize(); ++c) 
     result.add(b.items[c]); 
    return result; 
} 

當然,更清潔的方式是增加一個下標運算符:

T operator[](size_t x) const { return items[x]; } 

然後你不需要merge成爲朋友,並可以取代a.items[c]b.items[c],只有a[c]b[c]

+0

我很抱歉,因爲我基本上要求你喂這個給我,但我怎麼實際上實現下標操作符?這是我現在有: ArrayBag 合併(ArrayBag 一,ArrayBag B) { T接線員[](爲size_t X)const的{回報項目[X] } – KFDoom

+1

@KacheFlowe你需要把聲明放在你的類中,而不是在'merge'函數中。 – refi64

+0

我假設聲明將是.h文件中的公共函數呢? – KFDoom

0

您還沒有表現出你的ArrayBag代碼,但如果要合併兩個C風格的數組,你將不得不作出一個新的數組元素24和手動複製(或者,如果使用C +移動+11或C++ 14),然後刪除舊的數組。

順便說一下,假設你使用std :: string,你已經在使用STL了。

+0

對不起。我對此有點新。我還應該展示什麼? – KFDoom

+0

所有相關的代碼。如果沒有人向我們展示ArrayBag是什麼,那麼這裏的任何人都應該知道什麼是「ArrayBag」? – rlbond

+0

此外,這是否意味着我將不得不改變默認構造函數的容量?我想我的意思是使用複製等STL方法。 – KFDoom