GetUserNameW
.Advapi32.lib
.LNK2001 unresolved external symbol
и переходим по первой ссылке, которая снова, внезапно, по невероятному стечению обстоятельств оказывается документацией Microsoft.#pragma comment(lib, "Advapi32")
.#include <string>
#include <string_view>
#include <ranges>
#include <array>
#include <utility>
#include <algorithm>
#include <cassert>
#include <stdexcept>
template <typename Key, typename Value, std::size_t Size>
struct Map {
std::array<std::pair<Key, Value>, Size> data;
constexpr Value at(const Key key) const {
const auto iter = std::find_if(std::begin(data), std::end(data),
[&key](const auto& v) { return v.first == key; });
if (iter == std::end(data)) {
throw std::range_error("unknown character");
}
return iter->second;
}
};
static constexpr std::array<std::pair<std::string_view, char>, 51> MORSE_MAP = { {
{"•-", 'A'}, {"-•••", 'B'}, {"-•-•", 'C'}, {"-••", 'D'},
{"•", 'E'}, {"••-•", 'F'}, {"--•", 'G'}, {"••••", 'H'},
{"••", 'I'}, {"•---", 'J'}, {"-•-", 'K'}, {"•-••", 'L'},
{"--", 'M'}, {"-•", 'N'}, {"---", 'O'}, {"•--•", 'P'},
{"--•-", 'Q'}, {"•-•", 'R'}, {"•••", 'S'}, {"-", 'T'},
{"••-", 'U'}, {"•••-", 'V'}, {"•--", 'W'}, {"-••-", 'X'},
{"-•--", 'Y'}, {"--••", 'Z'}, {"-----", '0'}, {"•----", '1'},
{"••---", '2'}, {"•••--", '3'}, {"••••-", '4'}, {"•••••", '5'},
{"-••••", '6'}, {"--•••", '7'}, {"---••", '8'}, {"----•", '9'},
{"•-•-•-", '.'}, {"--••---", ','}, {"---•••", ':'}, {"••--••", '?'},
{"•----•", '\''}, {"-••••-", '-'}, {"-••-•", '/'}, {"-•--•", '('},
{"-•--•-", ')'}, {"•-••-•", '"'}, {"-•••-", '='}, {"•-•-•", '+'},
{"-••-", 'x'}, {"•--•-•", '@'}, {"/", ' '} } };
constexpr auto decode(std::string_view morse) {
constexpr auto map = Map<std::string_view, char, MORSE_MAP.size()>{ MORSE_MAP };
return morse
| std::ranges::views::split(' ')
| std::ranges::views::transform([](auto&& range) {
return map.at(std::string_view{ range });
})
| std::ranges::to<std::string>();
}
int main() {
const auto CODE = "•••• • •-•• •-•• --- --••--- / •-- --- •-• •-•• -••";
const auto TEXT = "HELLO, WORLD";
assert(decode(CODE) == TEXT);
return 0;
}
fopen_s
внезапно не сможет открыть файл и вернёт ошибку. Допустим, файла не существует, или на его открытие нет прав у пользователя. Ты же не проверяешь возврат результата из функции открытия и пытаешься что-то записать в F, даже если функция не смогла открыть файл и вернула ошибку. А когда она вернёт её, переменная F останется нулевыем указателем или, в первом твоём случае, вообще будет обращение к неинициализированной переменной, где ты получишь неопределённое поведение. Вот оно и ругается на эту ветку развития событий./std:c++latest
и кодить себе спокойно. Это лучший, быстрый и самый беспроблемный вариант. при этом под полиморфизмом понимается динамический полиморфизм
инкапсуляция (то есть в C++ это будет выражено классом с private и public функциями-членами)
private
и public
. А скорее про интерфейс и его сокрытую реализацию.class Widget {
public:
void add(shared_ptr<Widget> child);
};
auto root = make_shared<Widget>();
root->add(root); // о_О шта?
мы не знаем в данном месте кода, какой это именно виджет, но нам нужно вызвать draw, который может быть разным в зависимости от типа виджета
Вы скажете, что virtual call быстрее switch
От vector'а не рекомендуется наследоваться
Я не вижу тут необходимости в классах. Той редкой ситуации, как было с теми виджетами, когда у нас есть указатель непонятно на что, тут нет. Так что наследование и полиморфизм тут не нужны
Подскажите как это лучше всего сделать с использованием только стандартных библиотек C++?
std::streambuf
вызывается виртуальный метод overflow(), вот его перегружаете, проходите по буферу, делаете нужные вам изменения и сбрасываете буфер дальше на запись. Примерно, как тут.#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
int main() {
std::ofstream out_file( "out.txt" );
std::ifstream in_file( "in.txt" );
std::string/*stream*/ some_buffer;
using char_type = decltype(out_file)::char_type;
using in_iter = std::istream_iterator< char_type >;
if ( !in_file.is_open() || !out_file.is_open() )
return EXIT_FAILURE;
std::transform(in_iter(in_file), in_iter(), std::ostream_iterator< char_type >(out_file),
[&some_buffer] (const char_type &c) {
if ( !std::isalpha( static_cast<unsigned char>(c) ) || c == '\n' || c == '\r' )
return ' ';
// if шило, then мыло, буферизуем если надо, и т. п.
return c;
});
return EXIT_SUCCESS;
}
int var; int *pvar;
. Несмотря на то, что сумма размеров этих переменных на стеке sizeof(int) + sizeof(int*) = 12
для x86_64, выделяется 16 байт согласно пункту 3.2.2 SystemV ABI AMD64, который говорит, что стековый фрейм должен быть выровнен по границе 16 байт. На другой архитектуре здесь может быть другое правило.samp *ob;
ob = &func();
Т.е по сути моя i должна быть равна 3Не должна она вам ничего, пока документацию не прочитаете.
ios::trunc
при открытии файла? template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
first
и итератор на последний элемент last
. Ниже можно найти, что InputIt
значит InputIterator.Iterators
begin returns an iterator to the beginning
cbegin (public member function)
end returns an iterator to the end
cend (public member function)
begin()
даст нам итератор на первый элемент, т.е. first
, а end()
— на last
.Member types
Member type Definition
iterator BidirectionalIterator
ForwardIterator
удовлетворяет концепту InputIterator
. Как раз то, что нам нужно.for_each(test.begin(), test.end(), show);
for_each(test.cbegin(), test.cend(), [](int v) {std::cout << v << std::endl;});
cbegin()
и cend()
, т. к. нам не нужно модифицировать список, лучше воспользоваться константными итераторами, чтобы избежать ошибок в случае случайной модификации.for(const auto &v : test)
std::cout << n << ' ';
std::cout << '\n';