我想更多地了解模板。我试着编写自己的函数,它显示了每个容器元素。
public class Refreshtable extends Application {
@FXML
private TextField fname;
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob"));
final HBox hb = new HBox();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primarystage) {
Scene scene = new Scene(new Group());
// this.primaryStage.setTitle("Table View Sample");
primarystage.setWidth(450);
primarystage.setHeight(550);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory("firstName"));
table.setItems(data);
table.getColumns().addAll(firstNameCol);
final Button addButton = new Button("Add");
addButton.setOnAction((ActionEvent e) -> {
System.out.println("u entered");
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Refreshtable.class.getResource("newaddframe.fxml"));
AnchorPane anchorpane = (AnchorPane) loader.load();
Stage dialogStage = new Stage();
dialogStage.setTitle("Main");
dialogStage.initModality(Modality.WINDOW_MODAL);
Scene scenee = new Scene(anchorpane);
dialogStage.setScene(scenee);
dialogStage.showAndWait();
} catch (IOException es) {
es.printStackTrace();}
});
hb.getChildren().addAll(addButton);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll( table, hb);
((Group) scene.getRoot()).getChildren().addAll(vbox);
primarystage.setScene(scene);
primarystage.show();
}
@FXML
private void addd(){
data.add(new Person(
fname.getText()));
fname.clear();
}
public static class Person {
private final SimpleStringProperty firstName;
private Person(String fName) {
this.firstName = new SimpleStringProperty(fName);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
}
}
我的show_element函数尚未通用。我如何编写它,以便我可以将它用于不同的容器类型?
void show_element(int i){
std::cout << i << endl;
}
int main(){
int dataarr[5]={1,4,66,88,9};
vector<int> data(&daten[0],&daten[0]+5);
std::for_each(data.begin(),data.end(),show_element)
...
非常感谢
答案 0 :(得分:2)
更改为:
template <typename T>
void show_element(T const &i) { std::cout << i << std::endl; }
for_each
按顺序对取消引用[first,last]范围内的每个迭代器的结果应用给定函数(例如,show_element)。因此,您不需要获取容器的value_type。
同样在c ++ 14及以上版本中,您可以定义一个通用的lambda:
auto show_element = [](auto const &i) { std::cout << i << std::endl; };
并将其用作:
int arr[] = {1, 4, 66, 88, 9};
std::vector<int> data(arr, arr + sizeof(arr) / sizeof(int));
std::for_each(arr, arr + sizeof(arr) / sizeof(int), show_element);
答案 1 :(得分:1)
使用类更灵活,而不是函数。在这种情况下,您可以将其他参数传递给功能对象。
例如,您可以指定要输出元素的流或用于分隔流中元素的分隔符。
该课程可以采用以下方式
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
template <typename T>
class show_elements
{
public:
show_elements( const std::string &separator = " ", std::ostream &os = std::cout )
: separator( separator ), os( os ) {}
std::ostream & operator ()( const T &value ) const
{
return os << value << separator;
}
protected:
std::string separator;
std::ostream &os;
};
int main()
{
int arr[] = { 1, 4, 66, 88, 9 };
std::vector<int> v( arr, arr + sizeof( arr ) / sizeof( *arr ) );
std::for_each( v.begin(), v.end(), show_elements<int>() );
std::cout << std::endl;
}
程序输出
1 4 66 88 9
答案 2 :(得分:0)
另一种简单的方法是使用基于范围的for循环。
for(auto& element : container) {
cout<<element<<endl;
}