SearchVektor<unsigned int>
мы инициализируем из вектора vector<int>
. Это вообще ни в какие ворота не пишется. Для данного случая вам нужно…vector<int> liste
превратить в vector<unsigned int>
.SearchVektor(std::vector<T> && t )
. Такой конструктор будет очень быстрым, ибо дерёт всю информацию из t, оставляя в нём пустоту.return SearchVektor< unsigned int> (std::move(liste));
#include <algorithm>
class StudentList
{
public:
StudentList();
~StudentList();
Student& add(); // добавить пустого студента и выдать ссылку на новенького
size_t size() const { return fSize; }
Student& operator[](size_t i) { return *fData[i]; } // можно также наладить проверку диапазона — сделай это сам…
const Student& operator[](size_t i) const { return *fData[i]; }
void clear();
private:
typedef Student* PStudent;
PStudent* fData;
size_t fSize, fCapacity; // реальное кол-во студентов и на сколько студентов у нас заведено памяти.
// Указатели [fSize..fCapacity) резервные, их значение не определено и высвобождать
// их не надо.
enum { BLOCK_SIZE = 16; };
StudentList(const StudentList&) {} // копирование запрещаем, хочешь — реализуй сам и вынеси в public
StudentList& operator=(const StudentList&) { return *this; } // аналогично
};
StudentList::StudentList(); : fData(NULL), fSize(0), fCapacity(0) {}
Student& StudentList::add()
{
// Убедиться, что массива хватает; если нет — расширить
if (fSize >= fCapacity) {
size_t newCapacity = fCapacity + BLOCK_SIZE;
PStudent* newData = new PStudent[newCapacity];
std::copy(fData, fData + fSize, newData);
delete[] fData;
fData = newData;
fCapacity = newCapacity;
}
// Завести нового студента
Student* r = new Student;
fData[fSize++] = r;
return *r;
}
void StudentList::clear()
{
for (size_t i = 0; i < fSize; ++i)
delete fData[i];
delete[] fData;
fData = NULL;
fSize = 0;
fCapacity = 0;
}
StudentList::~StudentList()
{
clear();
}
#include <string>
class AcademyGroup
{
public:
std::string name;
StudentList students; // при желании можно заинкапсулировать и его.
};
std::vector<std::unique_ptr<Student>>
.std::deque<Student>
. someObject.x - viewport.x
.viewport.x = clamp(player.x - viewport.width / 2, 0, world.width - viewport.width);
Операторы перегружены правильно.
std::istream& operator>>(std::istream& s, Pnt& p) // убрать const!
explicit Pnt(int s) {…} // добавить explicit!
s >> p.a;
не подходит — поле-то неизменное. И тут, как ни странно, находится цепочка: создать временный Pnt и снова вызвать саму себя!Pnt& operator=(const int a) {
this->a = a;
return *this; // ну забыл!
}
Инструментом для этого, опять-таки, послужит операция new.
Так же яндексом выводится очень много задач/примеров, где дсд применяется к Стеку. В итоге получаем структуры и стек.
char s[100];
scanf("%99s", s);
len = strlen(s);
for (i = 0; i < len; ++i) {
name = s[i];
// обработай как-нибудь наш name…
}
scanf("%s",name);
scanf("%c", &name);
. Чтобы ввести кучу символов — я написал выше.for (i=1;i<=strlen(name);i++) {
'\0'
, т.е. его сложность O(n). Надо запомнить длину в отдельную переменную.char* p;
for (p = s; *p != '\0' ++p) {
if (name >= 97 && name <= 122)
if (name >= 'a' && name <= 'z')
? Константы 'a' и 'z' — в Си это тот же int, в C++ char (видимо, для совместимости с перегрузкой функций). открыть исходный и временный файлы
if (std::getline(исходный, s)) {
подкорректировать s
временный << s << std::endl;
while (std::getline(исходный, s) {
временный << s << std::endl;
}
закрыть оба файла
уничтожить исходный
переименовать временный
}
xmlns:sketch="http://example.com/sketch"
или что-то типа того).E1<<E2
and E1>>E2
, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2printf("\nYou choose incorrect type, %c please repeat...\nEnter r type :", i);