Хотела задать вопрос в talks, но почему у меня нет такой возможности. Я недавно занялась изучением программирования на c++, поэтому прошу сильно не ругаться.
Не так давно наткнулась на вакансию разработчика в yandex, и там обнаружила несколько вопросов. Страница уже удалена, но доступна в кэше: http://webcache.googleusercontent.com/search?q=cache:l4nvA4HtP5gJ:company.yan...
Не укажите на мои ошибки в рассуждениях?
Вопрос 1
Перепишите код, устранив имеющиеся в нём проблемы, но не изменяя функцию main
class Foo {
public:
Foo(int j) { i = new int[j]; }
~Foo() { delete i; }
private:
int* i;
};
class Bar: Foo {
public:
Bar(int j) { i = new char[j]; }
~Bar() { delete i; }
private:
char* i;
};
void main() {
Foo* f = new Foo(100);
Foo* b = new Bar(200);
*f = *b;
delete f;
delete b;
}
Здесь, я, как поняла, деструкторы должны быть виртуальными, должен быть описан оператор присваивания, а так же необходимо поле хранящее количество элементов, чтобы при копировании знать, какой длины массив? Или я что-то упустила?
Вопрос 2
В каких из следующих стандартных контейнеров худшее время поиска элемента по значению — O(log(n))?
std::vector
std::list
std::deque
std::set
std::multiset
std::unordered_set
std::unordered_multiset
сортированный std::vector
сортированный std::list
сортированный std::deque
Тут у меня совсем беда. Посоветуйте какое-нибудь чтиво на русском, из которого можно будет узнать особенности контейнеров и способ организации хранения данных, скорость выполнения тех или иных операций.
Вопрос 3
Напишите код, преобразующий 32-битное целочисленное представление ip-адреса в строковое.
Догадываюсь, что что-то нужно куда-то сдвигать =)
Вопрос 4
Есть класс Bar, предназначенный для работы в многопоточной среде. Перечислите проблемы, которые вы видите в его реализации.
class Bar {
public:
void Add(int i, double d) {
Locker auto_lock_d(m_doubles_);
Locker auto_lock_i(m_integers_);
integers_.push_back(i);
doubles_.push_back(d);
}
bool Find(int i) {
Locker auto_lock(m_integers_);
if (std::find(integers_.begin(), integers_.end(), i) != integers_.end())
return true;
else
return Find(double(i));
}
bool Find(double d) {
Locker auto_lock(m_doubles_);
return std::find(doubles_.begin(), doubles_.end(), d) != doubles_.end());
}
private:
std::vector<int> integers_;
std::vector<double> doubles_;
Mutex m_integers_;
Mutex m_doubles_;
};
На этапе добавления новых элементов от блокировок, кажется, не избавиться. А вот с поиском... В голову пришло только - залочить рабочий контейнер, скопировать его, и уже производить поиск по копии, сняв блокировку.