Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > accessing contiguous std::vector elements as a pair

Reply
Thread Tools

accessing contiguous std::vector elements as a pair

 
 
n.torrey.pines@gmail.com
Guest
Posts: n/a
 
      12-20-2007
I'd like to be able to view two contiguous elements of a vector as a
pair.

Assuming I'm not accessing the last element, of course, and the
element type is not bool, when is it safe to do so, from the language
definition point of view?

const pr& p = *(const pr*)(&v[i]);

// pr - either std:air or hand-defined pair of elements
// v - vector instance
// i + 1 < v.size()
 
Reply With Quote
 
 
 
 
Salt_Peter
Guest
Posts: n/a
 
      12-21-2007
On Dec 20, 6:45 pm, n.torrey.pi...@gmail.com wrote:
> I'd like to be able to view two contiguous elements of a vector as a
> pair.
>
> Assuming I'm not accessing the last element, of course, and the
> element type is not bool, when is it safe to do so, from the language
> definition point of view?
>
> const pr& p = *(const pr*)(&v[i]);
>
> // pr - either std:air or hand-defined pair of elements
> // v - vector instance
> // i + 1 < v.size()


When is it safe to do so? whenever you take the appropriate
precautions.
In this case, std::vectors have an at(...) member function that throws
an out_of_range exception should someone accidentally attempt to
access something out of bounds. There you go - problem solved.

Using pointers for that has no safety and usually demands considerably
more work (ie: maintenance).

In the following, i'm not too worried about getting main's for-loop
wrong, it'll throw if i do. Try it.

#include <iostream>
#include <vector>
#include <stdexcept>

template< typename T >
class Container
{
std::vector< T > m_v;
public:
// default ctor
Container() : m_v() { }
Container(const size_t sz, const T& t) : m_v(sz, t) { }
// member functions
void push_back(const T& t) { m_v.push_back(t); }
void showpair(const size_t index) const
{
std::cout << "m_v[" << index << "] ";
std::cout << m_v.at(index);
std::cout << "\tm_v[" << index + 1 << "] ";
std::cout << m_v.at(index + 1);
std::cout << std::endl;
}
size_t size() const { return m_v.size(); }
};

int main()
{
try
{
Container< int > container(5, 99);
container.push_back(77);
// use i < container.size() to throw an exception
for(size_t i = 0; i < container.size() - 1; ++i)
{
container.showpair(i);
}
}
catch(const std::exception& e)
{
std::cout << "\nError: ";
std::cout << e.what() << std::endl;
}
}

/*
m_v[0] 99 m_v[1] 99
m_v[1] 99 m_v[2] 99
m_v[2] 99 m_v[3] 99
m_v[3] 99 m_v[4] 99
m_v[4] 99 m_v[5] 77
*/




 
Reply With Quote
 
 
 
 
n.torrey.pines@gmail.com
Guest
Posts: n/a
 
      12-21-2007
On Dec 20, 5:22 pm, Salt_Peter <pj_h...@yahoo.com> wrote:
> On Dec 20, 6:45 pm, n.torrey.pi...@gmail.com wrote:
>
> > I'd like to be able to view two contiguous elements of a vector as a
> > pair.


> void showpair(const size_t index) const
> {
> std::cout << "m_v[" << index << "] ";
> std::cout << m_v.at(index);
> std::cout << "\tm_v[" << index + 1 << "] ";
> std::cout << m_v.at(index + 1);
> std::cout << std::endl;
> }






This is a joke, right?

If not, I didn't mean "view" in the common sense, and "at()" doesn't
add any safety if the index is already guaranteed to be in [0 ..
size()-2]
 
Reply With Quote
 
James Kanze
Guest
Posts: n/a
 
      12-21-2007
On Dec 21, 12:45 am, n.torrey.pi...@gmail.com wrote:
> I'd like to be able to view two contiguous elements of a vector as a
> pair.


> Assuming I'm not accessing the last element, of course, and the
> element type is not bool, when is it safe to do so, from the language
> definition point of view?


> const pr& p = *(const pr*)(&v[i]);


> // pr - either std:air or hand-defined pair of elements
> // v - vector instance
> // i + 1 < v.size()


Anytime your implementation gives you a special guarantee that
this will work. It's undefined behavior according to the
standard (even though it's likely to work most of the time in a
lot of implementations).

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
wordnet semantic similarity: how to refer to elements of a pair in alist? can we sort dictionary according to the value? Token Type Python 13 10-09-2012 04:00 PM
XSLT: iterating all child elements and accessing homonymous childrenin sibling elements Gerald Aichholzer XML 2 06-27-2006 03:46 PM
2D arrays: are all elements in a 2d array guarenteed to be contiguous? Paul C++ 1 11-24-2004 08:07 AM



Advertisments