Q:

¿Cómo puedo contar cuantas veces se repite un string dentro de otro string en C++?

Me gustaria saber cómo contar cuantas veces se repite un string dentro de otro string en C++. 
Sólo he encontrado formas de contar la repetición pero solo para un caracter.
Lo que me gustaria sería que por ejemplo si tengo un string p="AJAJDJSDJSDJNBDSJJAJSDKANSDKKSJAJSJSJSDAANSJDANSNADNAS", lo que me gustaria hacer es saber cuantas "AJA" hay, cuantas "JSKA" hay, cuantas "DANSN" hay........ en ese string p.
Lo unico parecido que he encontrado y he hecho es lo siguiente:
    #include <iostream>
    #include<string>
    #include<string.h>
    #include<stdlib.h>
    using namespace std;

    int main(){
    string string1="NLNNCCCL";
    string string2="CCCL";

    if (string1.find(string2) != std::string::npos) {
        std::cout << "se encontró!"<<endl;

    }

system("pause");
return 0;
}

Pero en ese codigo sólo aseguro la existencia del patrón digitado (string2) mas no las veces que se repite en el string1

A:

El siguiente fragmento de código representa otro modo de buscar el número de apariciones del substring dado dentro de una cadena origen.
Coloqué la función de conteo por separado por si deseas utilzarla dentro de tu código.
#include <iostream>
#include <string>

using namespace std;

unsigned long Count(string &origen, string &sub);

int main(int argc, char **argv)
{
    string origen = "ASDFASDADADASSSDAADAD";
    string subcadena = "AD";
    cout << "Apariciones de " << subcadena << ": " << Count(origen, subcadena) << endl;
    return 0;
}

unsigned long Count(string &origen, string &sub)
{
    unsigned long apariciones = 0;
    string substr = "";
    for (size_t i = 0; i <= (origen.size() - sub.size()); i++)
    {
        if (origen.substr(i, sub.size()) == sub)
        {
            apariciones++;
        }
    }
    return apariciones;
}

A:

No tienes mas que añadir un bucle, para que la búsqueda se repita mientra se encuentren coincidencias:
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

int main( ) {
  string string1 = "NLNNCCCL";
  string string2 = "CCCL";

  string::size_type idx = 0;
  int encontrados = 0;

  while( ( idx = string1.find( string2, idx ) ) != string::npos ) {
    ++encontrados;
    cout << "Encontrado en la posicion " << idx << ". Hasta ahora: " << encontrados << '\n';
    ++idx;
  }

  if( encontrados == 0 ) cout << "No encontrado\n";

  system( "pause" );
  return 0;
}

Puesto que std::string.find( ) soporta un 2º argumento para indicar en que posición comenzar la búsqueda, lo aprovechamos para iniciar cada búsqueda justo después de la posición en la que se encontró la última ocurrencia; de ahí el ++idx.

A:

¿Es una pregunta con trampa? Piensa que la repetición de una cadena dentro de otra puede tener matices, por ejemplo ¿cuántas repeticiones de "123123" deben contarse en "123123123"? ¿Una o dos?
123123123
^^^^^^ <-- Primera y única

123123123
^^^^^^ <-- Primera
   ^^^^^^ <-- Segunda

Si la respuesta es la segunda, puedes usar una función como esta:
int cuenta(const std::string &cadena, const std::string &texto)
{
    int resultado{};

    for (auto posicion = texto.find(cadena);
              posicion != std::string::npos;
              posicion = texto.find(cadena, posicion + 1))
    {
        ++resultado;
    }

    return resultado;
}

Si la respuesta es la primera, la función debería empezar a buscar al acabar la cadena encontrada, no al empezarla:
int cuenta(const std::string &cadena, const std::string &texto)
{
    const auto tamanyo = cadena.length();
    int resultado{};

    for (auto posicion = texto.find(cadena);
              posicion != std::string::npos;
              posicion = texto.find(cadena, posicion + tamanyo + 1))
    {
        ++resultado;
    }

    return resultado;
}

