Hippocamplus My Second Memory

CPP

File I/O

Read text file one line at a time

#include <fstream>

std::ifstream in_file('file.txt');
std::string line;
while(std::getline(in_file, line)){
    // Do something with 'line'
}
in_file.close();

Data structures

std::vector

#include <vector>

Init a vector:

std::vector<int> vec;

// init with N empty string
std::vector<std::string> vec(N);

// init with N zeros
std::vector<size_t> vec(N, 0);

Add an element (emplace_back):

// makes a copy of the new element and moves it to the back
vec.push_back('one element');
// makes a copy of the new element directly at the back (better for objects?)
vec.emplace_back(another_vector);

Loop over a vector:

for(unsigned int ii=0; ii<vec.size(); ii++){
    // LOOP ACTION on vec[ii]
}

for(auto elt: vec){
    // LOOP ACTION on element elt
}

Sort a vector:

#include <algorithm>

// ascending order by default
std::sort(vec.begin(), vec.end());
// descending order
std::sort(vec.begin(), vec.end(), std::greater<size_t>());

Remove elements of a vector (efficiently-ish) (erase):

auto it = vec.begin();
while (it != vec.end()) {
    if (CONDITION){
        // let's say we want to remove this element
        it = vec.erase(it);
    } else {
        it++;
    }
}

Check if something is in a vector (find):

bool value_in_vec = vec.find(value) != vec.end();

Misc:

// get size
vec.size();
// is the vector empty?
vec.empty();
// get the last element
vec.back();
// remove the last element
vec.pop_back();
// remove all elements
vec.clear();
// to allocate memory for N elements
vec.reserve(N);
vec.resize(N);

unordered_map

std::unordered_map<std::string,std::double> map_obj;
map_obj['key1'] = 1.3;
// check if a key is in the map
if(map_obj.count('key2') > 0)){
    // something with map_obj['key2'] ?
}
// iterate over key/value pairs
for(auto iter=map_obj.begin(); iter!=map_obj.end(); iter++){
    // iter->first contains the key
    // iter->secong contains the value
}

unordered_set

std::unordered_set<std::string> set_obj;
set_obj.insert(item1');
// check if an item is in the set
if(set_obj.find(item1') != set_obj.end()){
    // do something
}
// iterate over items
for(auto item : set_obj) {
    // do something with item
}

String manipulation

  • .length()
  • convert to int: atoi(str_obj.c_str());
  • convert to double: atof(str_obj.c_str());
  • check for presence of a substring:str_obj.find("pattern") == std::string::npos
  • extract a substring: str_obj.substr(3, 7)
  • insert characters: str_obj.insert(10, "INSERT")

Split a string

std::vector<std::string> split_str(std::string in_str, std::string delim="\t"){
  std::vector<std::string> line_v;
  auto f_start = 0U;
  auto f_end = in_str.find(delim);
  while (f_end != std::string::npos)
    {
      line_v.push_back(in_str.substr(f_start, f_end - f_start));
      f_start = f_end + delim.length();
      f_end = in_str.find(delim, f_start);
    }
  line_v.push_back(in_str.substr(f_start, in_str.size()));
  return line_v;
}