Unless you were specifically asked to store these values in a 2D array, you should go with the advice already given in the other solutions.
The main reason is that storing numeric values as string is definitiely not "tidy" and will cause all kind of problems in the rest of your program.
You have already presented a solution to your own question, but I've noticed you are using non-ascii codes for the double quotes and you are missing both a second closing brace, and a semicolon. Also, aggregate initialization does not use assignment: that '=' is wrong. All in all you have many errors in that one line, and quite likely the compiler error messages weren't overly helpful :
string v[2][4] = {{"001","apple","15","20$"},{"002","milk","5","3$"}
---------------^---^---^-^-----^-^--^-^---^---^---^-^----^-^-^-^--^-^^
With the right type of quote and the missing brace and semicolon and after deleting the '=' you get valid syntax:
string v[][4] {{"001","apple","15","20$"},{"002","milk","5","3$"}};
As for finding someting in that array, the easiest way is to use std::find or std::find_if from the algorithm library. This code finds the second entry and prints "milk":
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string v[][4] {{"001","apple","15","20$"},{"002","milk","5","3$"}};
auto has_id_002 = [](const string* values) { return values[0] == "002"; };
auto result = find_if(v, v+1, has_id_002);
cout << (*result)[1];
return 0;
}
P.S.: As Richard pointed out, you can actually use '=' for initialization. Apparently I mixed that up with something else.