[sksg] Switch containers from SkT(D)Array to std::vector

Skia's containers grow too aggressively, stick to STL containers for
reduced head overhead.

Also introduce Group::shrink_to_fit() to be used when clients know they
are done adding children to a group.

TBR=
Bug: skia:8340
Change-Id: I842db2e80c7cfb65a462e4859af6e63496863a5c
Reviewed-on: https://skia-review.googlesource.com/151161
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/modules/sksg/src/SkSGNode.cpp b/modules/sksg/src/SkSGNode.cpp
index 0cb578e..59ce87b 100644
--- a/modules/sksg/src/SkSGNode.cpp
+++ b/modules/sksg/src/SkSGNode.cpp
@@ -9,6 +9,8 @@
 #include "SkSGNode.h"
 #include "SkSGInvalidationController.h"
 
+#include <algorithm>
+
 namespace sksg {
 
 class Node::ScopedFlag {
@@ -46,7 +48,7 @@
 
 Node::~Node() {
     if (fFlags & kObserverArray_Flag) {
-        SkASSERT(fInvalObserverArray->isEmpty());
+        SkASSERT(fInvalObserverArray->empty());
         delete fInvalObserverArray;
     } else {
         SkASSERT(!fInvalObserver);
@@ -61,8 +63,8 @@
             return;
         }
 
-        auto observers = new SkTDArray<Node*>();
-        observers->setReserve(2);
+        auto observers = new std::vector<Node*>();
+        observers->reserve(2);
         observers->push_back(node->fInvalObserver);
 
         node->fInvalObserverArray = observers;
@@ -70,7 +72,8 @@
     }
 
     // No duplicate observers.
-    SkASSERT(node->fInvalObserverArray->find(this) < 0);
+    SkASSERT(std::find(node->fInvalObserverArray->begin(),
+                       node->fInvalObserverArray->end(), this) == node->fInvalObserverArray->end());
 
     node->fInvalObserverArray->push_back(this);
 }
@@ -83,9 +86,11 @@
         return;
     }
 
-    const auto idx = node->fInvalObserverArray->find(this);
-    SkASSERT(idx >= 0);
-    node->fInvalObserverArray->remove(idx);
+    SkDEBUGCODE(const auto origSize = node->fInvalObserverArray->size());
+    node->fInvalObserverArray->erase(std::remove(node->fInvalObserverArray->begin(),
+                                                 node->fInvalObserverArray->end(), this),
+                                     node->fInvalObserverArray->end());
+    SkASSERT(node->fInvalObserverArray->size() == origSize - 1);
 }
 
 template <typename Func>