Okay then how I would traverse the list. If I do pop_front its gets the first element but the doc says it DELETES it as well I want to maintain the list I have it associated with a items in a dropdown combo box.
When using insert you are providing the iterator my question is how do get value after I do list::begin to get the first when I bump it up with ++ operator I get an exception that I want past the end.
It appears from my test that using a saved iterator will yield inconsistent results. I have a list with a single element. After adding an item before the saved iterator it still points to the first element; i.e. not the newly inserted value. If I then increment the iterator it points to an invalid address. This is reasonable as the begin and end iterators are dynamically adjusted as the list increases or decreases. So the moment you add or remove an item, your saved iterator can no longer be relied upon. The take home message is - don't do it this way, use the proper member functions of the std::list.
Richard not sure how you add items with insert I get the initial pointer from begin but incrementing it with the ++ operator doesn't yield valid results
I think the push_back will have things in the right order
I am not sure what value the iterator should have when using insert to add an item with push_back I think the method allocates the storage
I think you missed the point. The begin and end iterators are dynamic and are recalculated every time you insert or remove an element from the list. In your case you capture the begin iterator which points to the first element of the list. You then insert an item at the front of the list, so your saved iterator is no longer valid. You then increment it so it could, quite reasonably, point beyond the end of the list. To use iterators properly you must call the begin and end methods of the list each time you need their values.
The iterator is controlled by the template class. So to get the current value of an iterator you must call begin or end. As I said previously these values are not fixed, but must be recalculated each time the list changes.
You can easily test this with a simple list of integer. Do some inserts and deletes and display the saved iterators after each action.
In order to do an insert I have to get a value for a iterator as the documentation says you provide that to insert
In all my google searches I have never seen how that’s done I understand begin starts a iterator with a initial value how do I get a value for it when inserting the second or third item the using the ++ operator gives me an exception
As I keep saying: To get an iterator you must call one of the functions listed under the title Iterators at std::list - cppreference.com[^]. If you then insert an element in front of the iterator then it is no longer valid. So before you increment it call begin a second time to ensure you have the current value.
If you create a list of your values first using push_back, then you can add them in one go at whatever point you need in your main list. Or you could use push_front passing your elements in reverse order.
Can somebody smarter than me explain it and help me solve it.
You don't need someone smarter - you just need to read the error message and think about what it is telling you.
I am not a C++ programmer, but it looks like you are trying to see if the contents of variable 'source' matches a pattern in a Regular Expression. However, this has no meaning because the system cannot possibly guess what pattern you want it to match against as you have not told it what pattern you want. My guess is that QRegExp is a class for regular expressions; so you will have to instantiate it, telling it (either in the constructor call or in a method of the instantiated object) what the Regular Expression that you wish to use is.
The error message that you have got is the compiler telling you that you are trying to run a member function (i.e. a method of a class) without having created an object and the function needs an object to use (which presumably has been told what Regular Expression pattern you are wanting to use for the comparison).
I have a template array class based on a std::vector. All worked well w/ c++17, but there is one line I can't seem to port to the new standard. I'm trying to acquire an iterator to the underlying vector.
Any advice is greatly appreciated.
An abbreviated depiction:
template<class Type>class CMy_Array
virtual ~CMy_Array ()
void InsertAt(int index)
// THE LINE IN QUESTION - trying to acquire an iterator...
// this worked w/ std:c++17 -
std::vector<Type>::iterator p = m_vItems.begin();
// With c++20, 2 errors occur;
// C2760 - syntax error: unexpected token 'identifier', expected ';' , and
// C7510 - 'iterator': use of dependent type name must be prefixed with 'typename'
// Using the documentation for C2760, I modified the line in question as so -
std::vector<Type>::iterator p = static_cast<std::vector<Type>::iterator> m_vItems.begin();
// This eliminated the C7510 error, but C2760 remains.
In fact, I do some calculations in CLASS A, then I want to show the results of those calculations in
CXXView class by using pDC->Textout(........).
I use InvalidateRect(NULL,NULL,FALSE) to redraw the view, but as you know it is not a good idea.
I have defined a CRect in CXXView class that I know those texts are going to be shown in that rect and I want to Invalidate just that rect from CLASS A.
On the other hand, while I am in CLASS A and using InvalidateRect function, this function needs 2 parameters of CXXView class to be done that are HWND and CRect is defined in class CXXView.
Why are you trying to do it from the "CLASS A" instance?
Just implement it in the CXXView class. Or, if your "CLASS A" already has a method that does what you need then just call it from within the instance of CXXView class (of course, this method must be declared as public or protected, not as private).
Last Visit: 31-Dec-99 19:00 Last Update: 1-Dec-23 10:58