The obvious possibilities in the standard library would be std::map and std::unordered_map. For std::map, you'd create some class holding A, B and C, and define a comparison function for that class. For std::unordered_map, you need to define a hash function instead.
For fast searching (and little or no interest in the speed of insertion and deletion) you might also consider using a vector sorted on the A, B, and C fields. This will typically improve speed and reduce space used compared to std::map. The disadvantage is that insertion and deletion become linear instead of logarithmic (i.e., slower--potentially quite a lot slower, especially when the collection is large).
As far as which of these to prefer: if you were working with large enough tables that the big-O complexity was likely to dominate, then std::unordered_map would be the obvious choice--it gives constant (expected) complexity. std::map gives logarithmic complexity. The sorted vector would be logarithmic as well if you used only a binary search. Assuming your keys are distributed reasonably, you could use an interpolating search, which normally has roughly O(log log N) complexity. log log N grows very slowly--so slowly it's often called "pseudo-constant" or something similar. IOW, even for tremendously huge tables, there's not much reason to believe hashing will necessarily be significantly faster.
Big-O analysis is most relevant to much larger tables though (say, hundreds of millions, rather than the tens of thousands suggested in the question). For the table size your suggesting, a logarithmic search algorithm might well be entirely competitive. For example, up to 65536 items, we expect no more than 16 comparisons for a binary search.
A lot then comes down to balancing memory use with search speed. If you're willing to sacrifice some space to get better search speed, a hash table (std::unordered_map) is probably the obvious choice. If you're more concerned with minimizing memory usage, then the sorted vector probably wins. std::map is probably the easiest of the three to implement, and (given the size you're talking about) its speed probably won't be a significant problem either (but the other two will probably be faster).