Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first...
Transcript of Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first...
![Page 1: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/1.jpg)
Lecture 3: Initialization and References
CS 106L, Fall ‘20
![Page 2: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/2.jpg)
Today’s Agenda
● Recap: Structures● Standard C++ Vector (Intro)● Uniform Initialization● Announcements● References● Const and Const References
![Page 3: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/3.jpg)
Recap: Structures and Types
![Page 4: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/4.jpg)
A struct is a group of named variableseach with their own type
![Page 5: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/5.jpg)
Struct Example
struct Student { string name; // these are called fields string state; // separate these by semicolons int age;}
Student s;s.name = “Ethan”; // use the . operator to access fieldss.state = “CA”;s.age = 20;
![Page 6: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/6.jpg)
int main() {std::pair<bool, Student> query_result;query_result.first = true;Report current = query_result.second;
}
A pair is a struct with two fields.
📝 std::pair is a template. You can use any type inside it; type goes in the <>.(We’ll learn more about templates in a future lecture.)
![Page 7: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/7.jpg)
Type Deduction using auto
// What types are these?auto a = 3;auto b = 4.3;auto c = ‘X’;auto d = “Hello”;auto e = std::make_pair(3, “Hello”);
📝 auto does not mean that the variable doesn’t have a type. It means that the type is deduced by the compiler.
Answers: int, double, char, char* (a C string), std::pair<int, char*>
![Page 8: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/8.jpg)
Before After
auto p = std::make_pair(“s”, 5);string a = s.first;int b = s.second;
auto p = std::make_pair(“s”, 5);auto [a, b] = p;// a is of type string// b is of type int
// auto [a, b] = std::make_pair(...);
Structured binding lets you initialize directly from the contents of a struct
📝 This works for regular structs, too. Also, no nested structured binding.
![Page 9: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/9.jpg)
Standard C++ vector (intro)
![Page 10: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/10.jpg)
Stanford Vector review
Vector<int> v;Vector<int> v(n, k);v.add(k);v[i] = k;auto k = v[i];
v.isEmpty();v.size();v.clear();v.insert(i, k);v.remove(i);
![Page 11: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/11.jpg)
Before After
Stanford C++ Vector
Vector<int> v;Vector<int> v(n, k);v.add(k);v[i] = k;auto k = v[i];
v.isEmpty();v.size();v.clear();v.insert(i, k);v.remove(i);
std::vector<int> v;std::vector<int> v(n, k);v.push_back(k);v[i] = k;auto k = v[i];
v.empty();v.size();v.clear();// stay tuned for a future lecture// stay tuned for a future lecture
Stanford Vector vs. Standard std::vector
![Page 12: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/12.jpg)
🤔 Questions? 🤔
![Page 13: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/13.jpg)
Uniform Initialization
![Page 14: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/14.jpg)
What’s initialization?
Initialization is how we provide initial values to variables
![Page 15: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/15.jpg)
Initialization examples
int x = 5; // initializing while we declare
int y;y = 6; // initializing after we declare
![Page 16: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/16.jpg)
In C++, initialization used to be tricky, and varied substantially depending upon the
type
![Page 17: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/17.jpg)
Examples of complicated initialization
std::pair<bool, int> some_pair = std::make_pair(false, 6);
// Student is a struct from last time // with name, state, and age fieldsStudent s;s.name = “Ethan”;s.state = “CA”;s.age = 20;
![Page 18: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/18.jpg)
That’s why uniform initialization is useful
Uniform initialization provides a way for us to use brackets to initialize anything
succinctly
![Page 19: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/19.jpg)
Before Afterstd::pair<bool, int> some_pair =
std::make_pair(false, 6);
Student s;s.name = “Ethan”;s.state = “CA”;s.age = 20;
std::pair<bool, int>some_pair{false, 6};
Student s{"Ethan", "CA", 20};
Uniform Initialization to the Rescue!
![Page 20: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/20.jpg)
Before Afterstd::pair<bool, int> some_pair =
std::make_pair(false, 6);
Student s;s.name = “Ethan”;s.state = “CA”;s.age = 20;
std::pair<bool, int>some_pair = {false, 6};
Student s = {"Ethan", "CA", 20};
We can also set our variable equal to the curly brackets chunk
![Page 21: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/21.jpg)
Uniform initialization examples
int x{3}; // Uniform initialization not super needed hereint y = {3};
// Both of these are vectors with elements {3, 5, 7}std::vector<int> a_vector{3, 5, 7};std::vector<int> another_vector = {3, 5, 7};
// Later, when we get to classes, we can use uniform// initialization to invoke our constructors, which dictate// how we initialize our variable
![Page 22: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/22.jpg)
A “gotcha” with uniform initialization
int n = 3;int k = 5;
std::vector<int> v(n, k); // {5, 5, 5}
Remember this way to initialize a std::vector?
![Page 23: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/23.jpg)
A “gotcha” with uniform initialization (cont.)
int n = 3;int k = 5;
std::vector<int> v(n, k); // {5, 5, 5}
This initialization uses a constructor (which 106B will talk more about soon)
![Page 24: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/24.jpg)
A “gotcha” with uniform initialization (cont.)
int n = 3;int k = 5;
std::vector<int> v(n, k); // {5, 5, 5}std::vector<int> v2{n, k}; // {3, 5} -- not the same!!
Normally, we can replace the () with {} to use uniform initialization--not here!
![Page 25: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/25.jpg)
Using {} for vector creates an initializer_list
auto list_init{3, 5}; // type is std::initializer_list
When we create a std::initializer_list, we actually end up invoking a different constructor!
![Page 26: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/26.jpg)
Moral of the story:
Make sure you’re completely clear what constructor you’re invoking when using
uniform initialization
![Page 27: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/27.jpg)
Complicated uniform initialization example
struct Course { string code; pair<Time, Time> time; vector<string> instructors;};
struct Time { int hour, minute;}
...
Course now{“CS106L”, { {16, 30}, {17, 50} }, {“Raghuraman”, “Chi”} };
Say we wanted to represent Stanford courses as structs
![Page 28: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/28.jpg)
🤔 Questions? 🤔
![Page 29: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/29.jpg)
Summary of Uniform Initialization● You can use uniform initialization to
initialize anything● Be careful of ambiguities with
std::initializer_list
![Page 30: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/30.jpg)
Announcements
![Page 31: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/31.jpg)
Announcements
● Office hours have been set up and will start on Friday:○ Nikhil: 7-8 AM PDT on Fridays○ Ethan: 6-7 PM PDT on Mondays
![Page 32: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/32.jpg)
Survey Results!
![Page 33: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/33.jpg)
Examples of Majors
● MCS● Physics● SymSys● CS● Chemistry● English● Product Design● EE● Math
![Page 34: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/34.jpg)
References
![Page 35: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/35.jpg)
A coding problem
struct Course { string code; pair<Time, Time> time; vector<string> instructors;};
struct Time { int hour, minute;}
...
void shift(vector<Course>& courses) { // TODO}
Write a function to shift all courses in a std::vector over by 1 hour
![Page 36: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/36.jpg)
Live Code Demo:Courses
![Page 37: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/37.jpg)
This is buggy!
void shift(vector<Course>& courses) { for (size_t i = 0; i < courses.size(); ++i) { auto [code, time, instructors] = courses[i];
time.first.hour++; time.second.hour++; }}
This creates a copy of the course
This is updating that same copy!
![Page 38: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/38.jpg)
This also doesn’t work!
void shift(vector<Course>& courses) { for (auto [code, time, instructors] : courses) { time.first.hour++; time.second.hour++; }} This creates a copy of the
courseThis is updating that same
copy!
![Page 39: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/39.jpg)
We need more information on reference parameters!
![Page 40: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/40.jpg)
What we’ve learned in 106B
int doubleValue(int& x) { x *= 2; return x;}
int main() { int myValue = 5; int result = doubleValue(myValue); cout << myValue << endl; // 10 cout << result << endl; // 10}
The variable myValue is passed by reference into doubleValue.
x inside doubleValue is an alias for myValue in main. This means it’s another name for the same variable!
A change to x is a change to myValue.
![Page 41: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/41.jpg)
References in variable assignment
std::vector<int> original{1, 2};std::vector<int> copy = original;std::vector<int>& ref = original;
original.push_back(3);copy.push_back(4);ref.push_back(5);
// original (and also ref!) = {1, 2, 3, 5}// copy = {1, 2, 4}
Notice the ampersand -- ref is an alias for original!
![Page 42: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/42.jpg)
std::vector<int> original{1, 2};std::vector<int> copy = original;std::vector<int>& ref = original;
original.push_back(3);copy.push_back(4);ref.push_back(5);
// original (and also ref!) = {1, 2, 3, 5}// copy = {1, 2, 4}ref = copy;copy.push_back(6);ref.push_back(7);// Q1: what are contents of original?// Q2: what are contents of copy?
Practice Problem (try afterward if you’d like)Read through the code below and think through the questions! (answers on next slide)
![Page 43: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/43.jpg)
vector<int> original{1, 2};vector<int> copy = original;vector<int>& ref = original;
original.push_back(3);copy.push_back(4);ref.push_back(5);
// original (and also ref!) = {1, 2, 3, 5}// copy = {1, 2, 4}ref = copy;copy.push_back(6);ref.push_back(7);// original = {1, 2, 4, 7}// copy = {1, 2, 4, 6}
A reference is always an alias to the same variable!This means setting ref equal to a new value is exactly the same as setting original equal to that value! We can’t change what variable ref aliases
![Page 44: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/44.jpg)
Live Code Demo:References pitfall
![Page 45: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/45.jpg)
Note: You can only create references to variables
int& thisWontWork = 5; // This doesn't work!
This has to do with something called l-values (as we saw in our error message), which we’ll discuss later in the course!
![Page 46: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/46.jpg)
🤔 Questions? 🤔
![Page 47: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/47.jpg)
Const and Const References
![Page 48: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/48.jpg)
const indicates a variable can’t be modified!
std::vector<int> vec{1, 2, 3};const std::vector<int> c_vec{7, 8}; // a const variablestd::vector<int>& ref = vec; // a regular referenceconst std::vector<int>& c_ref = vec; // a const reference
vec.push_back(3); // OKAYc_vec.push_back(3); // BAD - constref.push_back(3); // OKAYc_ref.push_back(3); // BAD - const
const variables can be references or not!
![Page 49: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/49.jpg)
const std::vector<int> c_vec{7, 8}; // a const variable
// BAD - can't declare non-const ref to const vectorstd::vector<int>& bad_ref = c_vec
Can’t declare non-const reference to const variable!
The below example isn’t permitted!
![Page 50: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/50.jpg)
std::vector<int> vec{1, 2, 3};
const std::vector<int>& c_ref = vec; // a const reference
// BAD - Can't declare a non-const reference as equal// to a const reference!std::vector<int>& ref = c_ref;
Can’t declare a non-const ref to a const ref!
The below is also not permitted!
![Page 51: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/51.jpg)
std::vector<int> vec{1, 2, 3};const std::vector<int>& c_ref = vec; // a const reference
// This is a non-const copy of vec, even though we're setting // it equal to a const reference! Remember that ref is just an// alias (aka another name) for vecstd::vector<int> copy = c_ref;
copy.push_back(4);// vec = {1, 2, 3}// copy = {1, 2, 3, 4}
If you don’t write &, C++ will make a copy by default!
![Page 52: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/52.jpg)
Need to explicitly specify const and & with auto!
std::vector<int> vec{1, 2, 3};const std::vector<int> c_vec{7, 8};std::vector<int>& ref = vec;const std::vector<int>& c_ref = vec;
auto copy = c_ref; // a non-const copyconst auto copy = c_ref; // a const copyauto& a_ref = ref; // a non-const referenceconst auto& c_aref = ref; // a const reference
![Page 53: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/53.jpg)
Remember: C++, by default, makes copies when we do variable assignment! We need
to use & if we need references instead.
![Page 54: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/54.jpg)
🤔 Questions? 🤔
![Page 55: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/55.jpg)
More about References
![Page 56: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/56.jpg)
You can return references as well!
// Note that the parameter must be a non-const reference to return// a non-const reference to one of its elements!int& front(std::vector<int>& vec) { // assuming vec.size() > 0 return vec[0];}
int main() { std::vector<int> numbers{1, 2, 3}; front(numbers) = 4; // vec = {4, 2, 3} return 0;}
This is something that the C++ Standard Library frequently makes use of.
![Page 57: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/57.jpg)
const int& front(std::vector<int>& vec) { // assuming vec.size() > 0 return vec[0];}
Can also return const references
![Page 58: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/58.jpg)
Dangling references: references to out-of-scope vars
int& front(const std::string& file) { std::vector<int> vec = readFile(file); return vec[0];}
int main() { front("text.txt") = 4; // undefined behavior return 0;}
Never return a reference to a local variable! They’ll go out of scope.
![Page 59: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/59.jpg)
Return to example: How could we fix this code? (chat)
void shift(vector<Course>& courses) { for (size_t i = 0; i < courses.size(); ++i) { auto [code, time, instructors] = courses[i];
time.first.hour++; time.second.hour++; }}
![Page 60: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/60.jpg)
Return to example: How could we fix this code?
void shift(vector<Course>& courses) { for (size_t i = 0; i < courses.size(); ++i) { auto& [code, time, instructors] = courses[i];
time.first.hour++; time.second.hour++; }}
This is one option.
This creates a reference to the course
This updates that reference!
![Page 61: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/61.jpg)
Return to example: How could we fix this code?
void shift(vector<Course>& courses) { for (auto& [code, time, instructors] : courses) { time.first.hour++; time.second.hour++; }}
This is another option.
This creates a reference to the courseThis updates that reference!
![Page 62: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/62.jpg)
When do we use references/const references?
● If we’re working with a variable that takes up little space in memory (e.g. int, double), we don’t need to use a reference and can just copy the variable
● If we need to alias the variable to modify it, we can use references● If we don’t need to modify the variable, but it’s a big variable (e.g.
std::vector), we can use const references
![Page 63: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/63.jpg)
Recap
● Uniform initialization○ A “uniform” way to initialize variables of different types!
● References○ Allow us to alias variables
● Const○ Allow us to specify that a variable can’t be modified
![Page 64: Lecture 3: Initialization and References · int main() {std::pair query_result; query_result.first = true; Report current = query_result.second;} A pair is a](https://reader034.fdocuments.net/reader034/viewer/2022051810/601a47198e797c456f43676d/html5/thumbnails/64.jpg)
Next time:
Streams