调用驱动程序“vector_test_driver.cpp”和您的类实现文件“VLIST.cpp”。为VLIST定义以下行为:
实现默认构造函数。每次调用函数时都包含以下消息“默认构造函数调用”。
实现复制构造函数以执行VLIST对象的深层复制。每次调用函数时都包含以下消息“复制构造函数调用”。该函数还应在单独的行上打印每个VLIST对象的内容。
实现析构函数。每次调用函数时都包含以下消息“ Destructor Invoked ”。
实施Is_Full()
,如果已满,则返回true;否则是假的;每次调用函数时都包含消息“ Is_Full Invoked ”。
实施Is_Empty()
如果为空则返回true;否则是假的;每次调用函数时都包含消息“ Is_Empty Invoked ”。
实现名为“搜索”的成员函数以在向量中搜索项目。该函数应打印消息“找到的项目”或“找不到项目”。打印哪条消息取决于是否在向量中找到了项目。打印您要查找的项目(搜索键)。每次调用该函数时都包含以下消息“搜索调用”。
实现一个名为“Insert”的函数,按顺序将项添加到向量中(按字母顺序排列)。该函数应在单个单独的行上执行函数之前和之后打印VLIST对象的内容。每次调用函数时都包含以下消息“插入调用”。
实现一个名为“Remove”的函数,从向量中删除一个项目。该函数应在单个单独的行上执行函数之前和之后打印VLIST对象的内容。每次调用该函数时都包含以下消息“删除调用”。
这是我的班级定义:
class VLIST
{
public:
//VLIST(); //default constructor
//VLIST(const VLIST &); //copy constructor
//~VLIST(); //destructor
//bool IsEmpty(); //return true if empty; otherwise false
//bool IsFull(); //return true if full; otherwise false
//vector<string>::iterator Search(const string &); //returns the location of the string in the dynamic array
//void Insert(const string & key); //add key to dynamic array if not full; otherwise prints a message stating dynamic array is full
//void Remove(const string & key); //removes key from dynamic array if it is there; otherwise prints a message stating it was not in dynamic array; the function using an iterator and the erase function to remove an item from the vector.
//void Print(); //Print every string in the array
//other functions may be implemented if necessary
private:
// VLIST<string> DB; //vector
//additonal state variables you may wish add
};
到目前为止我的插入函数代码;
void VLIST::Insert(const string & key) {
cout << "Insert invoked" << endl;
vector<string>::iterator vec;
vec = DB[count].begin();
DB[count].at(1) = key;
count++;
}
我只是在黑暗中拍摄。我确定朋友的功能可能会帮助我访问Db,因为它在私有领域。但我试图坚持给予我的骨架。我不确定如何正确地实现向量以在一个函数中插入字符串并将其打印到另一个函数中。 我不希望完成整个任务,我只是想看看如何实现插入功能
到目前为止我提出的打印功能:
void VLIST::Print() {
for (int i = 0; i < count;i++) {
cout << " " << DB[count].at(i) << endl;
}
答案 0 :(得分:1)
你必须&#34;实施&#34; std::vector
的插入排序。不清楚为什么你的教授称这个数据结构为一个列表但强迫你使用一个动态数组(可能是模仿一个)。我会做这样的事情。不要介意这些断言。
void Insert(const std::string& key)
{
std::cout << "Insert Invoked.\n";
print_db(std::cout);
assert(std::is_sorted(std::begin(db_), std::end(db_))); // Expects(std::is_sorted(db_));
db_.push_back(key);
auto insert_pos = std::upper_bound(std::begin(db_), std::end(db_)-1, key);
std::rotate(insert_pos, std::end(db_)-1, std::end(db_));
assert(std::is_sorted(std::begin(db_), std::end(db_))); // Ensures(std::is_sorted(db_));
print_db(std::cout);
}
这是Demo。
仔细查看我所做的事情并尝试将其融入您的模型中。而不是std::upper_bound
尝试使用您的Search
方法等。
您应该采取的一件事是重新使用标准提供的算法。查看std::rotate
和std::upper_bound
执行的操作(适用于RandomAccessIterator
)。
如果您为自己实施二进制搜索,请查看您完全进行了多少次比较,因为std::string
比较可能非常昂贵。您可以使用&#39;完全&#39;进行binary_search
。 log(n)
比较(每个循环一次比较,而不是两次或类似)。