根据作业,你需要编写一个mset类来执行set类的主要功能,但是通过vector类。同时,mset 类(需要编写的类)必须是模板,而不是绑定到特定的数据类型。我声明了一个迭代器,并在构造函数中尝试将其重置为向量的开头。此行给出以下错误:
错误 3 错误 C4430:缺少类型说明符 - 预期为 int。笔记。C++ 默认不支持 int
错误 5 错误 C2146:语法错误:缺少“;” 在 id "vj" 之前
问题:可能是什么问题?
问题#2:我该如何解决这个问题?
问题#3:这个错误的机制是什么?
我不会丢掉主要代码,因为只有对默认构造函数的调用、添加元素的方法调用和打印集合的调用。
编码:
#pragma once
#include <vector>
#include <iostream>
#include <iomanip>
using namespace std;
template <typename tname>
class mset
{
public:
vector<tname> vecSet;
vector<tname>::iterator vi;
vector<tname>::iterator vj;
mset()
{
vecSet.reserve(1);
vecSet[0] = 0;
vi = vecSet.begin();
vj = vecSet.begin();
}
void Add(tname value)//добавление элемента в вектор
{
vecSet.push_back(value);
sort();
}
void Rm(int index)//уничтожение элемента
{
vi = index;
vecSet.erase(vi);
sort();
}
bool RmDb() // уничтожение дубликатов
{
sort();
for (vi = vecSet.begin(); vi != vecSet.size(); vi + 1)
{
if (vecSet[vi] == vecSet[vi + 1])
{
vecSet.erase(vi);
}
}
}
tname TakeValue(int i)//взятие значения по индексу
{
vi = vecSet.begin();
return vecSet[vi+i];
}
void sort()//сортировка
{
for (vi = vecSet.begin(); vi != vecSet.size(); vi + 1)
{
for (vj = vecSet.begin(); vj != vecSet.size() - 1; j + 1)
{
if (vecSet[vj + 1] < vecSet[vj]) swap(vecSet[vj + 1], vecSet[vj]);
}
}
}
void Print()
{
for (vi = vecSet.begin(); vi != vecSet.size(); vi+1)
{
cout << setw(1) << vecSet[vi];
}
cout << endl;
}
~mset()
{
}
private:
// vector<tname>::iterator vecIt = 0;
};
虽然这不是问题的答案,但我仍然会写:
你想要做的事情叫做
flat_set. 例如,您可以采用boost::flat_set. 如果您想获得与功能相似的东西std::set-采用其界面而不是完全从头开始发明自行车是合乎逻辑的。该界面可以在这里查看。您可以将typename std::vector<T>::iteratorand保留为迭代器类型typename std::vector<T>::const_iterator- 在这种情况下,创建自己的迭代器确实没有意义,排序向量的迭代器完全符合迭代器的要求std::set实际上
flat_set,它只是一个已排序的向量。但这并不意味着每次插入时都需要对其进行排序!找到一个可以插入元素的地方就足够了,为此在标准库lower_bound和upper_bound. 如果你不想使用标准的,实现你自己的版本,它不会改变本质。那些。您只需要找到插入点upper_bound并插入带有重载的元素std::vector::insert(iterator_type it, value_type v)为什么您需要对该方法进行专业化?在同一个地方,模板方法(如果有的话)被简化为调用类似的方法
std::vector。如果您需要外部函数的重载,请编写类似