Неправильный результат std::string::length()
В операторе if дважды проверяю длину строки, дважды эта проверка игнорируется. Сделал вывод длин этих строк в cout, у каждой строки показало длину 2. Почему это происходит и как это исправить? Входные данные: 6 2 to be or not to be
#include <iostream>
#include <map>
#include <vector>
#include <string>
int main() {
size_t m, n;
std::map<std::string, size_t> map;
std::vector<std::string> vec;
std::string word;
std::cin >> m >> n;
for (size_t i = 0; i < m; ++i) {
std::cin >> word;
vec.push_back(word);
}
word.clear();
for (size_t i = 0; i < m; ++i) {
for (size_t j = 0; j < vec[i].length(); ++j) {
for (size_t k = j; k < n + j; ++k) {
word += vec[i][k];
}
if (word.length() == n) {
if (map.find(word) == map.end()) {
map[word] = 1;
} else {
++map[word];
}
}
word.clear();
}
}
for (const auto& [k, v] : map) {
if (k.length() == n) {
std::cout << v << " - " << k << "\n";
}
}
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ну, тогда все, что вам нужно, как я понимаю —
int main() {
size_t m, n;
std::map<std::string, size_t> map;
std::string word;
std::cin >> m >> n;
for (size_t i = 0; i < m; ++i)
{
std::cin >> word;
if (word.length() >= n)
for(size_t j = 0; j <= word.length() - n; ++j)
map[word.substr(j,n)]++;
}
for (const auto& [k, v] : map) {
std::cout << k << " " << v << "\n";
}
}
Разве что пересортировать вывод, если надо упорядочить по количеству...
Или даже так (надо пояснять, почему приведение к знаковому int необходимо?):
int main() {
int m, n;
std::map<std::string, size_t> map;
std::string word;
std::cin >> m >> n;
for (size_t i = 0; i < m; ++i)
{
std::cin >> word;
for(int j = 0; j <= int(word.length()) - n; ++j)
map[word.substr(j,n)]++;
}
for (const auto& [k, v] : map) {
std::cout << k << " " << v << "\n";
}
}