Почему компилятор предпочитает bool строке для неявного преобразования типа L “”?

Вы можете уменьшить сложность, сохраняя слова на карте, а затем перебирая карту в конце. Это экономит повторение результата для каждого слова

Старый массив сложности O(N * M * R) * слово в каждой группе * результат Новая сложность O(N*M + R)

большое время выполнения. Для каждого concat создается новый объект, а существующие и новые значения копируются в этот новый объект и возвращаются. Вот почему старые массивы не модифицируются. Таким образом, значения читаются снова и снова.

var array = [["a", "b"],["c", "d"],["b", "d"],["c", "a", "b"], ["a", "b", "c", "d"]];
var resultMap = {};
array.forEach(function (keywords) {
    keywords.forEach(function(word, i){
    if(resultMap[word]) {
        resultMap[word].frequency = resultMap[word].frequency + 1;
    }
    else{
        resultMap[word] = {
        keyword: word,
        frequency: 1
      };
    }
  });
});

console.log(Object.values(resultMap));

11
задан Martin v. Löwis 25 November 2008 в 03:19
поделиться

5 ответов

Во-первых, причина этой проблемы: Стандарт C++ [over.ics.rank]/2.11 определяет порядок на последовательности преобразования. Это говорит, что определяемая пользователем последовательность преобразования хуже, чем стандартная последовательность преобразования. То, что происходит в Вашем случае, - то, что строковый литерал подвергается булеву преобразованию (определенный в 4.12. Это - стандартное преобразование). Это не использует определяемое пользователем преобразование в std::wstring который был бы необходим, если бы это взяло другую перегрузку.

Я рекомендовал бы просто изменить имя одной из перегрузок или добавления перегрузки, которая принимает строковый литерал непосредственно (использующий тип параметра wchar_t const*).


1)

При сравнении канонических форм неявных последовательностей преобразования (как определено в [over.best.ics])

(2.1) стандартная последовательность преобразования является лучшей последовательностью преобразования, чем пользовательская последовательность преобразования или последовательность преобразования замещающего знака, и
(2.2) пользовательская последовательность преобразования является лучшей последовательностью преобразования, чем последовательность преобразования замещающего знака.

12
ответ дан 3 December 2019 в 04:54
поделиться

L"" указатель на строку широкого символа. Компилятор полагает, что преобразование в bool имеет приоритет по преобразованию в станд.:: wstring.

Для решения проблемы представьте новый setValue:

void setValue(std::wstring const& name, const wchar_t * value);
8
ответ дан 3 December 2019 в 04:54
поделиться

Так как bool является встроенным типом, преобразование от wchar_t до bool предпочтено. Я сказал бы, что простое решение состоит в том, чтобы добавить перегрузку, которая берет массив wchar_t и бросок явно там:

setValue( const std::wstring& name, const wchar_t s[] )
{
     setValue(name, wstring(s));
}
2
ответ дан 3 December 2019 в 04:54
поделиться

Упростить немного, следующий код

#include <iostream>
using namespace std;

void f(const string &s)
{  cout << "string version called" << endl;  }

void f(const bool &b)
{  cout << "bool version called" << endl;  }

int main()
{  f("Hello World");  }

печать "bool названная версия". Вы уверены, что Ваш код перестал работать только с пустой строкой?

1
ответ дан 3 December 2019 в 04:54
поделиться

Вы могли сделать новое функциональное взятие некоторым другим типом, чем bool - возможно, просто прокси для bool - который не конвертируем от литеральной строки. Но действительно я просто переименовал бы функцию bool-взятия и был бы сделан с нею.

0
ответ дан 3 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: