Opened 11 years ago

Closed 11 years ago

#5915 closed Bugs (invalid)

boost::split replaces original data

Reported by: mathstuf@… Owned by: Pavol Droba
Milestone: To Be Determined Component: string_algo
Version: Boost 1.47.0 Severity: Problem
Keywords: Cc: jayen@…

Description

Pseudo-ish code:

<code> std::vector<std::string> nodes; nodes.push_back("z"); boost::split(nodes, "a:b:c", ':'); </code>

After this, "z" is no longer a member of nodes due to a std::swap in iter_split. Result.insert(Result.end(), itBegin, itEnd) (or some equivalent) should probably be done instead. The docs state:

"Each part is copied and added as a new element to the output container."

Either the docs are incorrect or the code needs fixed.

Change History (3)

comment:1 by jayen <jayen@…>, 11 years ago

Cc: jayen@… added

comment:2 by Marshall Clow, 11 years ago

Confirmed with 1.48:

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

template <class Container>
void print ( const Container &c ) {
	std::cout << "{ ";
	for ( typename Container::const_iterator iter = c.begin (); iter != c.end (); ++iter )
		std::cout << *iter << " ";
	std::cout << "}" << std::endl;
	}

#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

int main ( int argc, char *argv [] ) {
	std::vector<std::string> nodes;
	
	nodes.push_back ("z");
	print (nodes);

	boost::split (nodes, "a:b:c", boost::is_any_of(":"));
	print (nodes);
	
	return 0;
	}

Prints: { a b c }

comment:3 by Marshall Clow, 11 years ago

Resolution: invalid
Status: newclosed

The 1.48 documents at http://www.boost.org/doc/libs/1_48_0/doc/html/boost/algorithm/split_id1125874.html state:

Note: Prior content of the result will be overwritten.

Closing this as "Not a bug".

Note: See TracTickets for help on using tickets.