Блог
cpp
Блог
cpp
Живя среди других, иногда подвергаешься влиянию всей этой суеты. Случилось даже, что меня одолели мысли о бесполезности С++ в нашем быстром мире и я начал серьезно подумывать на какой язык перескочить. Конечно же, в фаворитах оказался C#. Близкий к С++ синтаксис, поддержка сильной компании и т.д.. И перескочил бы, не повстречайся мне некоторые факты. Факты пока для меня достаточно сырые, и все же я оказался ими впечатлен настолько, что всерьез задумался над тем, куда все это катится и стоит ли катиться вместе со всеми. Факты следующие: чистая операционная система Linux занимает всего несколько мегабайт на жестком диске, а чистая Windows Vista - 15 гигабайт (может мир сошел с ума?). Сам сижу на XP, поэтому пишу с чужих слов, но намерен в скором времени проверить это лично. Отдаю себе отчет в том, что в Vista включена куча прибамбасов и она сразу готова ублажать ленивого пользователя всеми доступными развлечениями. Девственный Linux вряд ли сгодится для подобных тем (если конечно не поставить готовый дистрибутив), поэтому эти факты могут тронуть только сердца ИТ -специалистов, которыми еще не полностью овладели темные силы M$. Предварительные выводы, которые я сделал для себя (пока тоже сырые):
- Пока жив Linux будет жив C & C++;
- Пока нужны быстрые и надежные сервера (а когда они будут не нужны?) будет жив Linux.
- Поставив себе чистый Linux, я получаю возможность конфигурировать его так, как мне необходимо (отличный конструктор, прямо как в детстве!).
- Когда все собираешь сам, будешь с системой "на ты". Разве это не то, что нужно сисадмину или программисту?
- Чем больше деталей содержит механизм, тем больше вероятности, что какая-то из них может сломаться. Чем их меньше, тем легче найти поломку. Windows напоминает Титаник (особенно Vista), где есть все, включая тонны золотых украшений, назначение которых ублажать взоры капризных дам, и помочь быстрее пойти ко дну в случае беды. А сама конструкция такова, что нет возможности при необходимости удалить бирюлички, не сломав что-нибудь полезного. Хотите пересечь на такой штуке океан - ваше право.
Фастфуд уже давно стал привычным и даже полюбился большой частью человеческой рассы, причем во всех сферах жизни. Fast life, fast love, fast sex, .., fast death. И в этой спешке просто некогда вдаваться в детали. А если станешь вдаваться - отстанешь от других и все пропустишь (чего именно - не знаю, но знаю, что не успеешь и точка). В этой спешке нужно скорее выпустить продукт, чтобы опередить конкурента, и соответственно, больше заработать. Не сложно заметить, что качество продукта не является приоритетным, опять же касательно всего: от садовода, до крупной софтверной компании. Ремесло больше не цель, не призвание, а средство. И наверно, при таком положении дел несколько глупо ожидать от садовода полезных питательных продуктов, а от софтверной компании - игры захватывающей дух, с завораживающей музыкой, сливающейся с пленяющими сказочными мирами. Зато в порядке вещей купить регулярно "падающий" MS Word от самой крупной компании, которая разрабатывает его на своих же технологиях!
struct stTest
{
bool bl; // false
int i; // 0
double d; // 0.0
};
stTest gT;stTest gT = {true, -1, 3.14};gT = {true, -1, 3.14}; memset(0, sizeof(stTest), &gT);stTest gT = {true, -1, 3.14};
stTest* p_gT = &gT;
memset(0, sizeof(p_gT), &gT);gT.bl = true;
gT.i = -1;
gT.d = 3.14;void initStruct(stTest& st)
{
st.bl = true;
st.i = -1;
st.d = 3.14;
}initStruct(gT);const stTest initT = {true, -1, 3.14};gT = initT;
struct stTest
{
bool bl; // false
int i; // 0
double d; // 0.0
static const stTest& init()
{
static const stTest obj = {true, -1, 3.14};
return obj;
}
};gT = gT.init();gT = stTest::init();stTest::init() = gT;stTest::init().bl = false;void main( )
{
std::string str;
str.append('\0'); // падает
}string& append( const element_type *_S );
struct stXYZ
{
int x, y, z;
};
stXYZ point;
struct stXYZ point;
enum typeNum {ONE = 1, TWO, THREE};
void typeNum(const typeNum tn)
{
// do anything
}
void main( )
{
typeNum type_num1; // так нельзя - неоднозначность
enum typeNum type_num2; // так можно, явно указывает, что это enum
}
#include < iostream >
#include < string >
#include < list >
#include < functional >
#include < algorithm >
// класс - фуктор для поиска подстроки
struct str_finder: public std::binary_function< std::string, std::string, bool >
{
result_type operator()(const first_argument_type& str_first, const second_argument_type& sub_str)const
{
if ( std::string::npos == str_first.find(sub_str) )
return false;
return true;
}
};
// фуктор-объект для вывода строк списка
struct strShow
{
void operator() (const std::string& str)const
{
std::cout < < "'" < < str < < "'" < < std::endl;
}
};
// функция для вывода строк списка
void fnShow(const std::string& str)
{
std::cout < < "'" < < str < < "'" < < std::endl;
}
void main()
{
std::list< std::string > list_str;
list_str.push_back("one");
list_str.push_back("two");
list_str.push_back("three, two, one");
list_str.push_back("333, five, one");
list_str.push_back("six");
// строка-фильтр для удаления
const std::string str("one");
// Вывод списка в консоль, используя объект strShow:
std::cout < < "\nDemo source-list:" < < std::endl;
std::for_each(list_str.begin(), list_str.end(), strShow());
// Поскольку алгоритм remove_if не удаляет элементы, а всего лишь группирует в начало списка те
// элементы, которые не должны быть удалены, то после его работы размер списка не меняется.
// Также алгоримт remove_if возвращает итератор установленный на элемент, следующий за последним
// из тех, что не должны быть удалены. Конец списка может содержать различный мусор состоящий из
// копий различных элементов списка, обычно тех, которые были на тех позициях до применения алгоритма remove_if.
std::list< std::string >::iterator new_end = std::remove_if(list_str.begin(), list_str.end(),
std::bind2nd(str_finder(), str) );
// Вывод в консоль списка после смещения элементов не подлежащих удалению в начало списка:
std::cout < < "\nDemo list after moving non-revomed items:" < < std::endl;
std::for_each(list_str.begin(), list_str.end(), strShow());
// Вывод в консоль только конца списка подлежащего удалению:
std::cout < < "\nDemo end-of-list for deleting:" < < std::endl;
std::for_each(new_end, list_str.end(), strShow());
// удаление конца списка:
list_str.erase( new_end, list_str.end() );
// снова демонстрация всего списка после всех операций, но теперь используется вдля вывода ф-ия fnShow:
std::cout < < "\nDemo list after all treatments:" < < std::endl;
std::for_each(list_str.begin(), list_str.end(), fnShow);
std::cout < < std::endl;
}