wstring* arr
, то *arr
— первая строка в нём; (*arr)[0]
— первый символ первой строки. Тут всё верно.vector<wstring>
. В данном случае, подходит именно вектор, т.к. в строке может быть разное число слов. namespace strings
{
using native_char = boost::filesystem::path::value_type;
using native_string = std::basic_string<native_char>;
namespace detail
{
inline void write(const std::string& string)
{
std::cout.write(string.c_str(), string.size());
}
inline void write(const std::wstring& string)
{
std::wcout.write(string.c_str(), string.size());
}
}
using fmt::format;
template <typename S, typename... Args>
void print(const S& format_str, Args&&... args)
{
const auto string = fmt::format(format_str, std::forward<Args>(args)...);
detail::write(boost::locale::conv::utf_to_utf<native_char>(string));
}
using boost::locale::conv::utf_to_utf;
using boost::locale::conv::from_utf;
using boost::locale::conv::to_utf;
using boost::locale::conv::between;
inline native_string to_native(const std::string& utf8)
{
return utf_to_utf<native_char>(utf8);
}
inline std::string from_native(const native_string& native)
{
return utf_to_utf<char>(native);
}
}
vector<Object> objects;
objects.emplace_back("models/tree.png", 600, 1000, 93, 178);
bool operator >(const triple& n) const
{
return c > n.c;
}
using triple = std::tuple<int, int, int>;
vector<vector<pair<int, int>>>
, где каждый внутренний vector<pair<int, int>>
содержит рёбра, ведущие из вершины с соответствующим индексом, а каждая pair<int, int>
- это пункт назначения и вес ребра. tolower
выдаёт сконвертированный символ, причём в виде int (о ужас!), его надо сразу вручную кастануть к char. Это то, что надо выводить.islower
проверяет, является ли аргумент строчной буквой и возвращает тоже int (о ужас!), его надо сразу вручную кастануть к bool. Это то, что надо проверять в if.this
— это указатель на текущий объект. *this
— это ссылка на текущий объект. Пример:class A {
public:
int x;
A(const A& other) = default;
A& operator=(const A& other) {
x = other.x;
return *this;
}
};
void test() {
A a(1); // a.x == 1
A b(2); // b.x == 2
A c(3); // c.x == 3
a = b = c;
// a.x == 3
// b.x == 3
// c.x == 3
}
a = (b = c);
. Итак, вначале b = c
. Вызывается b.operator=(c)
. Там мы вначале присваиваем c.x
(3) в b.x
, затем (и это здесь самое главное!) возвращаем ссылку на b. Далее в a = (результат)
объекту a
присваивается та самая возвращённая ссылка на b, благодаря чего в a.x
тоже оказывается 3. template <size_t size>
struct Array {
MyClass data[size];
};
Array<5> a;
a.data[2] = ...;
std::vector<std::unique_ptr<object>> world;
auto terr = std::make_unique<Terrain>();
world.push_back(std::move(terr));
world.push_back(std::make_unique<Terrain>());
object& operator=(object&&) = delete;
virtual ~object() = default;
l1.push_back(report);
, в список добавляется копия report
. Содержимое l1
не имеет никакого отношения к report
, report1
, report2
. Соответственно, когда вы будете изменять l1
, естественно, переменные report*
не будут меняться.l1.emplace_back();
(при необходимости, передайте туда параметры для конструктора Student). Далее: l1.back()
вернёт вам ссылку на свежесозданного студента, и вы сможете его дозаполнить, если нужно. (Осторожнее со ссылкой, а то опять копию создадите :) ) string s = "abc";
unsigned int arr[mxN];
unordered_set
. Считать в него числа, потом пройтись по нему и смотреть, есть ли противоположное число.