Определение operator<<
может быть следующим:
std::ostream& operator<<(std::ostream& out, const LLSortedPosInt& l) {
out << "<";
NodePtr current = l.head;
// check that it actually points to a Node before accessing any fields
if(current) {
out << current->key;
// loop through the links and stream the keys
while((current = current->next) != nullptr)
out << "," << current->key;
}
out << ">";
return out;
}
Конструктор LLSortedPosInt(int key)
не должен создавать узел HEAD_OF_LIST
, поскольку он ни для чего не используется. Таким образом, вы можете изменить этот конструктор, чтобы использовать тот, который у вас уже есть, для списка ключей через делегирование. Делегирование также облегчает добавление конструктора, используя initializer_list
:
LLSortedPosInt(const int *keys=nullptr, size_t n=0) :
head(nullptr)
{
if(keys && n) {
while(n--) {
createNode(*keys);
++keys;
}
}
}
// single key construction
LLSortedPosInt(int key) :
LLSortedPosInt(&key, 1) // delegate
{}
// construction using an initializer list
LLSortedPosInt(std::initializer_list<int> il) :
LLSortedPosInt(il.begin(), il.size()) // delegate
{}
Интерфейс static createNode
немного странный. Пользователям функции не нужно указывать указатель на следующий узел. Вот для чего предназначен контейнерный класс. Его можно превратить в обычную функцию-член и напрямую создать узел в правильном месте:
NodePtr createNode(int key) {
NodePtr current = head;
NodePtr previous = nullptr;
while(current && (current->key < key)) {
previous = current;
current = current->next;
}
if(previous) {
// insert the node between previous and previous->next
NodePtr rv = new Node(key, previous->next);
return previous->next = rv;
} else {
// insert the node first in the list
NodePtr rv = new Node(key, head);
return head = rv;
}
}
Учитывая, что фактический Node
выглядит примерно так:
struct Node {
Node* next;
int key;
Node(int k, Node* n) : next(n), key(k) {}
Node(const Node&) = delete;
Node(Node&&) = delete;
Node& operator=(const Node&) = delete;
Node& operator=(Node&&) = delete;
~Node() = default;
};
using NodePtr = Node*;
Те "xmlns:" атрибуты не относятся к SOAP. Они определяют префиксы, которые позже будут использоваться для обозначения пространств имен XML. Пример:
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts"
DTS:ExecutableType="SSIS.Package.2">
Это определяет DTS как префикс, который означает пространство имен «www.microsoft.com/SqlServer/Dts». Затем он обращается к атрибуту ExecutableType из этого пространства имен.
Пространства имен XML выполняют ту же работу, что и пространство имен в C # или C ++. Они предоставляют пространство для определения имен, чтобы имена из одного пространства имен не конфликтовали с именами в другом. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts"
DTS:ExecutableType="SSIS.Package.2">
Это определяет DTS как префикс, который означает пространство имен «www.microsoft.com/SqlServer/Dts». Затем он обращается к атрибуту ExecutableType из этого пространства имен.
Пространства имен XML выполняют ту же работу, что и пространство имен в C # или C ++. Они предоставляют пространство для определения имен, чтобы имена из одного пространства имен не конфликтовали с именами в другом. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts"
DTS:ExecutableType="SSIS.Package.2">
Это определяет DTS как префикс, который означает пространство имен «www.microsoft.com/SqlServer/Dts». Затем он обращается к атрибуту ExecutableType из этого пространства имен.
Пространства имен XML выполняют ту же работу, что и пространство имен в C # или C ++. Они предоставляют пространство для определения имен, чтобы имена из одного пространства имен не конфликтовали с именами в другом. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.
чтобы имена из одного пространства имен не конфликтовали с именами из другого. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что. чтобы имена из одного пространства имен не конфликтовали с именами из другого. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.Судя по уровню вашего вопроса (пожалуйста, не обижайтесь), похоже, что вы новичок в XML, а также в веб-сервисах на основе XML. Джон Сондерс правильно описывает пространства имен XML и их использование. Если вы хотите лучше понять веб-службы, основанные на XML и XML, я рекомендую вам начать с руководства по XML в W3 Schools (в частности, с раздела о пространствах имен XML).
Учебное пособие находится по адресу: http://www.w3schools.com/xml/default.asp
Раздел, посвященный пространствам имен XML, находится по адресу: http://www.w3schools.com/xml/xml_namespaces.asp
Эта цитата из спецификаций W3C SOAP также должна помочь здесь:
Приложение SOAP ДОЛЖНО включать правильное пространство имен SOAP для всех элементов и атрибуты, определенные SOAP в сообщения, которые он генерирует. Мыло приложение ДОЛЖНО обрабатывать Пространства имен SOAP в сообщениях, которые он получает. Он ДОЛЖЕН отбрасывать сообщения которые имеют неправильные пространства имен (см. раздел 4.4) и МОЖЕТ обрабатывать SOAP сообщения без пространств имен SOAP как хотя у них был правильный SOAP пространства имен.
SOAP определяет два пространства имен (см. [8] для получения дополнительной информации о XML пространства имен):
• Конверт SOAP имеет пространство имен идентификатор " http://schemas.xmlsoap.org/soap/envelope/ "
• Сериализация SOAP имеет идентификатор пространства имен " http://schemas.xmlsoap.org/soap/encoding/ "
Сообщение SOAP НЕ ДОЛЖНО содержать Объявление типа документа. Мыло сообщение НЕ ДОЛЖНО содержать Обработку Инструкции. [7]