我创建了一个存储人名的vector<string> names;
。我想取每个名称并创建两个变量first_letter
和last_letter
,其中包含每个名称的第一个和最后一个字符。但是,由于我刚开始使用c ++,我不太清楚如何完成这项工作。任何人都可以向我解释如何做到这一点,并可能提供一个例子吗?
答案 0 :(得分:4)
假设name
是您的string
并且您使用C ++ 11即可,name.front()
和name.back()
将起作用,否则取消引用迭代器:{ {3}}和*name.begin()
。虽然您要检查name
是否为空:
if (!name.empty()) {
// Safe to proceed now
}
您可以像*name.rbegin()
一样迭代names
- 自C ++ 11以来
for (auto& name : names) {
// Do things with individual name
}
或(对于较旧的C ++)
for (vector<string>::iterator it = names.begin(); it != names.end(); it++) {
// Do things with individual name (*it)
}
建议尽可能使用常量迭代器,如果您不打算修改字符串,请将auto
替换为const auto
,将::iterator
替换为{{1} }}
答案 1 :(得分:4)
在C ++ 11中,它变得更容易:
for (std::string& name : names) {
char first_letter = name.front();
char last_letter = name.back();
// do stuff
}
在此之前,您必须使用operator[]
直接访问它们:
for (size_t i = 0; i < names.size(); ++i) {
std::string& name = names[i];
char first_letter = name[0];
char last_letter = name[name.size() - 1];
// do stuff
}
答案 2 :(得分:2)
使用字符串函数front()
和back()
。
在使用这些功能之前,请确保该字符串不为空:
假设i
是向量的索引:
if ( !names[i].empty() )
{
char fChar = names[i].front();
char bChar = names[i].back();
}
答案 3 :(得分:1)
创建一个函数以从单个字符串中获取两个字母:
std::pair<char, char>
first_and_last(const std::string& s)
{
if (s.length() == 0)
throw std::runtime_error("Empty string!")
return {s.front(), s.back()};
}
(对于C ++ 03 return std::make_pair(s[0], s[s.length()-1])
或其他答案显示的其他方法。)
然后依次将该函数应用于每个名称,将结果保存在新的向量中:
std::vector<std::pair<char, char>> letters;
letters.reserve(names.size());
std::transform(names.begin(), names.end(), std::back_inserter(letters), first_and_last);
或者使用基于C ++ 11范围的for
循环:
std::vector<std::pair<char, char>> letters;
letters.reserve(names.size());
for (const auto& name : names)
letters.push_back( first_and_last(name) );
答案 4 :(得分:0)
这样的东西?没有错误检查,但它是一个开始。
vector<string> names = ...;
for (vector<string>::iterator i = names.begin(); i != names.end(); ++i)
{
string first_letter = i->substr(0, 1);
string last_letter = i->substr(i->size() - 1, 1);
}
答案 5 :(得分:0)
首先,当然,你从一个循环开始迭代矢量。 然后你得到带有substr的那些字符,它看起来像这样
vector <string>::iterator it;
for(it = names.begin(); it != names.end(); it++)
{
string first = (*it).substr(0, 1);
string second = (*it).substr((*it).length()-1, 1);
..
do whatever you want to
..
}
答案 6 :(得分:0)
考虑以下方法
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <utility>
#include <iterator>
int main()
{
std::vector<std::string> v { "Hello", "NinjaZ", "How", "do", "you", "do" };
for ( const auto &s : v ) std::cout << s << ' ';
std::cout << std::endl;
std::vector<std::pair<char, char>> v2;
v2.reserve( v.size() );
std::transform( v.begin(), v.end(),
std::back_inserter( v2 ),
[]( const std::string &s )
{
return std::make_pair( s.front(), s.back() );
} );
for ( const auto &p : v2 )
{
std::cout << p.first << ' ' << p.second << std::endl;
}
return 0;
}
输出
Hello NinjaZ How do you do
H o
N Z
H w
d o
y u
d o
您可以使用基于for循环的普通范围代替算法std::transform
。例如
for ( const auto &s : v ) v2.push_back( { s.front(), s.back() } );
答案 7 :(得分:0)
有很多方法可以给这只猫上皮。
这是使用C ++ 11的另一个简短的可读示例。这给表带来的是std::vector::emplace_back
的使用,它允许就地构造元素,而不是移动或复制构造。还有更短的语法,这很好。
假设您有一个存储字母对的容器。
std::vector<std::pair<char, char>> letters;
然后使用:
for (auto&& name : names)
letters.emplace_back(name.front(), name.back());
如果你想抛出空名字符串,只需在std::vector::emplace_back
语句之前添加一条语句:
if (name.empty()) throw std::runtime_error("Empty string!");