lexpexkex (lexpexkex) wrote,
lexpexkex
lexpexkex

Вопросы по программированию.

Споткнулся об шаблоны STL.

Суть такова:

Когда я запихиваю объекты класса в array, я получаю список с копиями этих объектов. А мне нужно запихать туда именно сами объекты, чтобы я мог работать с ними(изменять) как по индексу(целочисленные индексы мне будет проще передавать в функцию диалога, чем с десяток объектов класса), так и по имени. В общем как надо правильно запихнуть в контейнер STL именно адреса объектов? Тем более, что, возможно, мне понадобится много разных списков(допустим, списки знакомых и незнакомых главному герою неписей) для работы с одними и теми же объектами и нет смысла тратить память. В общем, как правильно передать объекты класса по ссылке в список? Или составить список ссылок на объекты. Надеюсь, я понятно выразился. Беглый гуглинг почему-то не помог. А в хвалённых мной видеоуроках пока все эти контейнеры используются исключительно для интов и без переменных.
[Spoiler (click to open)]

using namespace std;


class human
{
public:

human()
{
name = "Noname"; lastname = "Noname"; age = 20;
}
human(string name, string lastname, short age)
{
this->name = name; this->age = age; this->lastname = lastname;
}
// Геттеры, сеттеры и функции
string GetName() { return name; }
string GetLastname() { return lastname; }
short GetAge() { return age; }
void SetLastname(string name) { this->name = name; }
void PrintData() { cout << name << " " << lastname << " " << age << " лет" << endl; }
// переменные

private:
string name;
string lastname;
short age;
};

class npc : public human
{
public:
npc(string name, string lastname, short age) :human(name, lastname, age) {}
npc() {}// Без конструктора по умолчанию не засунуть в вектор или аррау
};


class player : public human
{
public:
player(string name, string lastname, short age) :human(name, lastname, age) {}
};


array < npc, 10 > npc_arr;

int main()
{
setlocale(LC_ALL, "Russian");
npc woman("Шерон", "Стоун", 38);
npc woman2("Элизабет", "Тейлор", 38);
npc_arr[0] = woman;
npc_arr[1] = woman2;
npc_arr[0].SetLastname("Наташа");//Изменили имя
woman.PrintData();//но исходный объект остался прежним
npc_arr[0].PrintData();//А вот в аррау копия изменилась, то есть происходит копирование по значению.
player gamer("Лекс", "Дэвидсон", 36);
string pathtofile = "1\\text123.txt";
system("pause");

return 0;
}



И вопрос по питону (там я ещё даже до классов не дошёл).
В каких случаях надо применять '\n', а в каких '\\n'?
Ведь перевод строки именно '\n', а '\\n' - хз что.
[Spoiler (click to open)]

import urllib.request

goog_url = 'http://www.sample-videos.com/csv/Sample-Spreadsheet-5000-rows.csv'

def download_stock_data(csv_url):
response = urllib.request.urlopen(csv_url)
csv = response.read()
csv_str = str(csv)
lines = csv_str.split('\\n') #Совершенно непонятно почему 2 слэша
dest_url = r'goog.csv'
fx = open(dest_url, 'w')
for line in lines:
fx.write(line + '\n')
fx.close()

download_stock_data(goog_url)
Tags: #Совершенно
Subscribe
Вот, а ты боялся, что массивы в C++ кривые. :-) Через ООП и перегрузки операций [] можно сделать какие угодно массивы и сущности, для любых целей и с более-менее удобным применением.

По STL не подскажу, знаю еще меньше тебя. :-) Судя по коду, операция индексации действительно создает копию объекта и добавляет в массив (список). Может, в array <> есть методы прямого доступа к указателю на указанный объект - элемент массива.
Ну, пробовал пихать туда ссылку и указатель, что-то компилятор не пропустил.

И да, строки с массивами в С++ не однозначны.

botanoid

1 day ago

botanoid

1 day ago

lexpexkex

1 day ago

gatoazul

1 day ago

lexpexkex

1 day ago

gatoazul

1 day ago

botanoid

1 day ago

gatoazul

1 day ago

botanoid

1 day ago

botanoid

1 day ago

Отвечаем, для этого придумали std::shared_ptr : засовываем объект в умный указатель, а указатель - туда куда вам нужно.
А можно пример? не получается засунуть указатель в вектор или аррау.

alexandr terlecky

1 day ago

lexpexkex

1 day ago

alexandr terlecky

1 day ago

paincliff

May 5 2018, 08:24:22 UTC 1 day ago Edited:  May 5 2018, 08:26:36 UTC

>> все эти контейнеры используются исключительно для интов и без переменных.
Давно не пользовался с++
Не поможет в данном случает приведение типа указателя к int ?
https://ru.wikipedia.org/wiki/Приведение_типа#Приведения_типов_в_языке_C++
Не, сами контейнеры универсальные, просто нет примеров как они с классами или переменными работают. Чтобы именно переменные можно было изменять, а не просто скопировать с них значения.
> lines = csv_str.split('\\n')

Пример запутанный и неудачный

"\n" дает символ с кодом 0x0A, такой сплит разбивает по концам строк, как и положено. Но тут он не используется :-)

"\\n" дает строку с двумя символами подряд "\" "n"

Файл, который забирается в примере, тянется по урл. В результате получается одна длинная строка, в которой концы строк исходного файла помечены четырьмя символами "\" "r" "\" "n" (НЕ кодами перевода строки, а только их изображением из четырех символов подряд)

Дальше эта длинная строка делится на отдельные по последовательности "\" "n"

А \r так и остаются болтаться в получившихся строках.

Правильно там вообще должно быть

lines = csv_str.split('\\r\\n')

lexpexkex

May 5 2018, 09:33:55 UTC 1 day ago Edited:  May 5 2018, 09:36:00 UTC

Хитровато, да. В общем в данном случае это не один символ '\n', а два символа '\' и 'n', а символ '\' уже по правилам обрабатывается двумя слэшами'\\'.

Я правильно понял?

gatoazul

1 day ago

Создаёшь массив указателей, умных или тупых, и складываешь указатели в массив

pornozombie

May 5 2018, 09:46:12 UTC 1 day ago Edited:  May 5 2018, 09:48:29 UTC

А вообще есть стековерфлоу на русском, для тех, кто не может в инглиш. Ломись туда со всеми вопросами
Не, лучше сюда. Полезно вспомнить о хорошем.

pornozombie

1 day ago

Valentin Raznosilin

May 5 2018, 10:26:41 UTC 1 day ago Edited:  May 5 2018, 10:29:05 UTC

Лол. В C# переменная содержащая адрес объекта это всегда ссылка. Т.е. пишешь что то типа List<Foo> foo_list; и больше никакого гимора. Все таки какой же уебищный язык этот ваш Си++.
Мало в блоге Лекса хохлосрача - надо ещё холивары начать. Выяснить какой язык уебищный, а какой нет

prizrak_liberal

1 day ago

alexandr terlecky

1 day ago

bill_bf

1 day ago

prizrak_liberal

May 5 2018, 11:23:35 UTC 1 day ago Edited:  May 5 2018, 11:39:41 UTC

Мнение далёкого от программирования:
Землю должен копать робот-землекоп, а программировать - робот-программист. Эффективность потому что выше.

Кстати, почему левые не празднуют 200-летие дедушки Маркса? Странно.
Вон даже провертикальновластный "Взгляд" отжигает: Учение Маркса совпало с цивилизационным кодом русского народа.
Роботов-программистов не существует. И в ближайшие 20 лет не ожидается даже в проекте.

prizrak_liberal

1 day ago

gatoazul

1 day ago

pornozombie

1 day ago

gatoazul

1 day ago

pornozombie

1 day ago

gatoazul

1 day ago

botanoid

1 day ago

lexpexkex

1 day ago

Лекс, не слушай никого, слушай меня )
Если тебе нужен список объектов, то есть такая функция emplace_back(). Она сразу выделяет нужное количество памяти, помещает в список (массив) и инициализирует объект, все это делает без создания всяких копий, например:

list humans;
humans.emplace_back( параметры как у конструктора ); //вот тут выделяется память, создает элемент списка и инициализируется объект

Также я тебе советую передавать объекты функциям по ссылке: Human( const string& name ); тогда меньше накладных расходов.
Еще у тебя геттер: string GetName() { return name; }
Правильнее будет: const string& GetName() { return name; } Возвращать ссылку
>> const string& GetName() { return name; }

Это пример того, что надо бежать от С++ куда подальше, даже в визуал бейсик. :-) В 90-е я вообще доходил до абсурда:

template const matrix _MP & _MF matrix::
operator = (const matrix _MP & Matrix) const { }

Сейчас смотрю, как баран на ворота, на все эти const. _MP и _MF я придумал как define для модификаторов Borland C++, вдруг пригодится в будущем. :-)

prizrak_liberal

1 day ago

botanoid

1 day ago

botanoid

1 day ago

alexandr terlecky

1 day ago

airog

1 day ago

botanoid

1 day ago

airog

1 day ago

botanoid

1 day ago

lexpexkex

1 day ago

airog

1 day ago

gatoazul

1 day ago

They liked it 0