What does the expression for(int& item : v4) means : [duplicate] - c++

This question already has answers here:
C++11 range based loop: How does it really work
(3 answers)
C++ ranged based for loop
(2 answers)
'colon' and 'auto' in for loop c++? need some help understanding the syntax
(3 answers)
Closed 6 months ago.
v4 is a vector, the loop is to iterate through the vector list and display the elements in the vector. what does the expression inside the for loop means.
the code is as follows :

This is a range-based for loop. It iterates over all the elements of the v4 vector, and lets you process via the item variable in each iteration.

It iterates through the container v4, whatever that is, let's say it's a vector
The & in "int&" means that it's a reference, if you change the item, it's gonna change the value in the as well.
Similar to
for (int i = 0; i < v4.size(); i++){
item = v4[i];
//...
}

Related

Updating class member values inside a range based for loop in C++ [duplicate]

This question already has answers here:
What is the difference between iterator and &iterator?
(3 answers)
Closed 8 months ago.
The code on top works. The code below it does not. Why?
I am searching through a vector of class objects in C++ using the object's name member so as to increment it's watched member. The regular for loop and syntax successfully increments the member. However, my attempt to do the same using what I assumed was the correct syntax for a range based for loop is unsuccessful. What is the correct syntax to make it successful?
//This works
for(size_t i{0}; i<mList.size(); ++i)
{
if(mList.at(i).name == name_val)
{
mList.at(i).watched += 1;//Successfully increments member of the object
return;
}
}
//This does not work
for(auto m : mList)
{
if(m.name == name_val)//This if clause does appear to work though..
{ //..in a different function.
m.watched += 1;//But this here is not incrementing the object member
return;
}
}
BTW, if it makes a difference, these loops are inside of a method that along with the vector are members of a friend class to the class of objects in the vector. And I have also already tried ++m.watched; and ++(m.watched); without success. Thank you
Your loop makes a copy of the element into m every iteration. Your changes to m will be to that copy. Make m a reference to the element in the container instead:
for(auto& m : mList)

Is it possible to iterate through pair of values using for loop in c++? [duplicate]

This question already has answers here:
What are use cases for structured bindings?
(4 answers)
Closed 2 years ago.
Is something like this is possible or there is any way to assign the pair values separately in for loop?
vector<pair<int, int>> arr;
// Input some values here in arr
for(auto &[x,y]: arr){
cout<<x<<" "<<y;
}
Your code is actually valid code in C++17 or later, as #MikeCAT said. You're using what's called a structured binding. It can unpack values from arrays or simple class types, in this case from pairs.

How to make a range to use range based for (to replace traditional for)? [duplicate]

This question already has answers here:
C++0x way to replace for(int i;;) range loops with range-based for-loop
(1 answer)
Is there a range class in C++11 for use with range based for loops?
(8 answers)
Closed 4 years ago.
I have the following loop in more then one place:
for(int step = 1; step < timesteps; step++) ...
Then I had to change timesteps to start at 0. And I have to change it in more then one place.
May I take advantage of range based for loops in this situation? So may be I can write just
for(auto &step : timesteps) ...
In that case what kind of timesteps should be used? std::vector timesteps?
Before I forget to mention, timesteps is just an int i.e. int timesteps = 10;. Unknown at compile time, the user will define it.
p.s.: stl is preferred over boost.

Can range based for loop work for assignment? [duplicate]

This question already has answers here:
Setting vector elements in range-based for loop [duplicate]
(4 answers)
Closed 6 years ago.
Is it possible to use/implement a ranged base loop to assign numbers to an array?
What I want:
for (auto i : X){
i = 1;
} //I want this to fill the array with 1.
Is it possible to use/implement a ranged base loop to assign numbers to an array?
Yes, use a reference:
for (auto & i : X){
// ^
i = 1;
}

Sort Multidimensional Vector [duplicate]

This question already has answers here:
Standard library sort and user defined types
(3 answers)
Closed 8 years ago.
I have a two dimensional vector A
vector < vector <int> > A;
the inner vector is of constant length 3. I want to sort A according to the values of 2nd element in the inner vector. Like we can sort a database table according to any of its column.
How do I do that?
std::sort(std::begin(m), std::end(m),
[](std::vector<int> const &lhs,
std::vector<int> const &rhs) { return lhs[1] < rhs[1]; });
Be careful though as this is not a stable sort and will not preserve the order of lines that have the same second element. Use std::stable_sort if you want this. The usage is identical.