Ошибка С++ std::string при добавлении размера в виде строки на карту

Я нашел кое-что на инструменты Visual Studio v143 std:С++ последний это ошибка или что

std::unordered_map<std::string, std::string> map;
std::string test_str = "1234567890123456789012345678901234567890123456789012345";//55 LEN String
map["test_len"] = test_str.length();
std::cout << map["test_len"]; // 7 on 55 len string

Обновлено: во всех числах одинаково. Chrome будет работать, даже если Content-Lenght недействителен.

Вы видите символ со значением 55 в ASCII, он же '7'. Вместо этого вы, вероятно, хотели std::unordered_map<std::string, int>.

Nelfeal 09.10.2022 00:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пытаетесь поместить length() на карту string -> string. Вместо этого вам нужно поставить to_string():

#include <unordered_map>
#include <string>
#include <iostream>

int main() {
    std::unordered_map<std::string, std::string> map;
    std::string test_str = "1234567890123456789012345678901234567890123456789012345";//55 LEN String
    map["test_len"] = std::to_string(test_str.length());
    std::cout << map["test_len"];
}

Обратите внимание, что у std::string есть ctor от char, как в ответе Максима, поэтому ваш код не является ошибкой, просто он не такой, каким вы ожидали.

Ответ принят как подходящий

В заявлении

map["test_len"] = test_str.length();

std::unordered_map::operator[] по умолчанию создает новый std::string и возвращает ссылку на него, которая затем присваивается значению типа size_type. Это присваивание вызывает std::string::operator=(char), которое интерпретирует целочисленное значение 55 как символ ascii 7.

Это давняя ошибка юзабилити в интерфейсе std::string. Примеры бага:

std::string s = test_str.length(); // Compiler error.

std::string s2;
s2 = test_str.length(); // Compiles successfully, std::string interface bug.
s2 = true; // Compiles successfully, std::string interface bug.
s2 = std::ios_base::failbit; // Compiles successfully, std::string and std::ios_base interface bugs.

std::string s3{std::ios_base::failbit, 55, true, 'a'}; // Compiles successfully, std::string interface bug.
std::string s3 = {std::ios_base::failbit, 55, true, 'a'}; // Compiles successfully, std::string interface bug.

Типобезопасный способ С++ 17 для вставки или присвоения значения в ассоциативный контейнер:

map.insert_or_assign("test_len", test_str.length()); // Compiler error.
map.insert_or_assign("test_len", {std::ios_base::failbit, 55, true, 'a'}); // Compiler error.
map.insert_or_assign("test_len", std::to_string(test_str.length())); // Success.

std::unordered_map::insert_or_assign всегда использует прямую инициализацию сопоставленного значения, чтобы избежать именно таких тихих непредвиденных ошибок преобразования типа, когда оператор присваивания типа имеет семантику, отличную от его конструктора, что нарушает инженерный принцип наименьшего сюрприз.

Другие вопросы по теме

Почему Microsoft использует такие типы, как __int32 и т. д., вместо int32_t?
Почему эта функция иногда ведет себя неправильно, когда я использую gsl::not_null?
Как я могу экспортировать функцию в C++, используя комментарий #pragma(linker, "/export:...), когда путь содержит специальный символ и пробелы?
Неоднократный безостановочный вывод, когда я ввожу char в переменную int
Не удается открыть исходный файл с ошибкой endian.h — в чем проблема?
Как заставить MSVC генерировать сборку, которая кэширует память в регистре?
Как временно установить десятичный разделитель в C/С++?
Включение предварительно скомпилированного заголовка и непредварительно скомпилированного заголовка в файл .cpp приводит к тому, что файл .cpp не распознает непредварительно скомпилированный заголовок
Как получить из «std::thread::id» тот же идентификатор, что и «идентификатор потока WinAPI» (в Windows)?
Вопросительные знаки в поиске по шаблону в Windows